/** * 冒泡算法 * 比较两两值,一次冒泡之后最右边的值肯定是为最大的 * 第二次冒泡,就只要针对除去最后一个值的数值进行冒泡 * [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 }