/**
* 冒泡算法
* 比较两两值,一次冒泡之后最右边的值肯定是为最大的
* 第二次冒泡,就只要针对除去最后一个值的数值进行冒泡
* [22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70]
*/
function bubble_one_time(arr, j) {
for (let i = 0; i < arr.length-j; i++) {
const element = arr[i];
if (arr[i] > arr[i+1]) {
let temp
temp = arr[i+1]
arr[i+1] = arr[i]
arr[i] = temp
}
}
return arr
}
function bubble_sort (arr) {
for (let i = 0; i < arr.length; i++) {
arr = bubble_one_time(arr, i)
}
return arr
}
/**
* 插入排序
* 从原数组一个一个遍历,将其放到新数组,但要
* 维持新数组的序列
*/
function insertSort (arr, l, r) {
for (let i = l + 1; i <= r; i++) {
if (arr[i] < arr[i-1]) {
let temp = arr[i]
let j = i
while (j > l && arr[j-1] > temp ) {
arr[j] = arr[j-1]
j--
}
arr[j] = temp
}
}
}
/**
* 快速排序
* 是对冒泡排序的一种改进
* 通过一趟排序将数据分为两部分,再对这两部分
* 分别递归排序,以此类推
* 双向的扫描比单项扫描快
*/
function quick_sort(arr, l, r) {
if (l < r) {
let e = quick_one_time(arr, l, r) // e 是一次快排的分界线,以此对左右两边再进行快排
quick_sort(arr, l, e-1)
quick_sort(arr, e+1, r)
}
return arr
}
function quick_one_time (arr,i,j) {
// i 和 j是两个指针,初始的时候分别指向首尾
// 设定一个基准值 初始为 arr[0]
let pivot = arr[i]
// 现在指针移动,
while (i < j) {
while(arr[j] > pivot && i < j){
j--
}
arr[i] = arr[j]
while (arr[i]< pivot && i < j) {
i++
}
arr[j] = arr[i]
}
// 指针重叠,说明遍历完一次了
arr[i] = pivot
return i
}