const insertSort = list => { for (let i = 1; i < list.length; i++) { let j = i - 1 let value = list[i] while (j >= 0) { if (value < list[j]) { list[j + 1] = list[j] list[j] = value } j -= 1 } } }
const shellSort = list => { let len = list.length, gap = 1 // 动态定义间隔序列 while (gap < len / 3) { gap = gap * 3 + 1 } // 最后还是做了间隔为1的插入排序,只是这个时候再插入基本不需要怎么移动了 for (gap; gap > 0; gap = Math.floor(gap / 3)) { for (let i = gap; i < len; i++) { // 插入排序 temp = list[i] let j = i - gap while (j >= 0) { if (list[j] > temp) { list[j + gap] = list[j] list[j] = temp } j -= gap } } } }
选择排序
思路: 一次遍历,每次确立第i位的元素是什么
1 2 3 4 5 6 7 8 9
const selectSort = list => { for (let i = 0; i < list.length; i++) { for (let j = i; j < list.length; j++) { if (list[j] < list[i]) { [list[i], list[j]] = [list[j], list[i]] } } } }
// 堆调整 const heapify = (arr, i, len) => { let root = i, left = 2 * i + 1, right = 2 * i + 2 if (left < len && arr[left] > arr[right]) { root = left } if (right < len && arr[right] > arr[root]) { root = right } if (root !== i) { [arr[i], arr[root]] = [arr[root], arr[i]] heapify(arr, root) } }
// 创建大顶堆 const buildHeap = (arr, len) => { // 从i=len/2开始,是因为大于len/2没有左和右节点 // 另外需要从len / 2层往上走才行 for (let i = Math.floor(len / 2); i >= 0; i--) { heapify(arr, i, len) } }
const heapSort = list => { let len = list.length buildHeap(list, len) for (let i = list.length - 1; i > 0; i--) { [list[i], list[0]] = [list[0], list[i]] len -= 1 buildHeap(list, i, len) } }