function selectSort(arr) { for(var i = 0, n = arr.length;i < n-1;i++){ var min = i for(var j = i + 1;j < n;j++){ if(arr[j]<arr[min]){ min = j } } if(min !== i) { var temp = arr[i] arr[i] = arr[min] arr[min] = temp } } return arr }
– 插入排序
1 2 3 4 5 6 7 8 9 10 11 12
function insertSort(arr) { for(var i = 1, n = arr.length; i < n ; i++) { var j = i - 1 var current = arr[i] while(current < arr[j] && j >= 0) { arr[j+1] = arr[j] j-- } arr[j+1] = current } return arr }
– 折半插入排序 减少搜索次数,但数据交换次数不变
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
function insertSort2 (arr) { for (let i = 1, n = arr.length; i < n; i++) { let right = i let left = 0 let mid var current = arr[i] while (left <= right) { mid = Math.floor(left + (right - left) / 2) if (current < arr[mid]) right = mid - 1 else left = mid + 1 } for (var j = i - 1; j >= left; j--) arr[j + 1] = arr[j] arr[j+1] = current } return arr }
function shellSort(arr) { var len = arr.length; // gap一直到1(直接插入排序) for (var gap = Math.floor(len / 2); gap > 0; gap = Math.floor(gap / 2)) { for (var i = gap; i < len; i++) { var j = i; var current = arr[i]; while (j - gap >= 0 && current < arr[j - gap]) { arr[j] = arr[j - gap]; j = j - gap; } arr[j] = current; } } return arr; }
function quickSort2(ary, comparator = (a, b) => a - b) { return partition(ary, comparator) } function partition(ary, comparator, start = 0, end = ary.length - 1, ) { if (start >= end) { return }
var pivotIndex = Math.floor(Math.random() * (end - start + 1) + start) var pivot = ary[pivotIndex]
swap(ary, pivotIndex, end)
for (var i = start - 1, j = start; j < end; j++) { if (comparator(ary[j], pivot) < 0) { i++ swap(ary, i, j) } }
swap(ary, i + 1, end) partition(ary, comparator, start, i) partition(ary, comparator, i + 2, end) return ary }
非递归方法实现快排(使用栈)(函数递归开销大)
1 2 3 4 5 6 7 8 9 10 11
function quickSort2(arr, left, right) { var stack = [] //使用数组的push、pop方法实现栈效果 stack.push(right, left) while(stack.length > 0) { var l = stack.pop(), r = stack.pop() if(l < r) { var mid = pritation(arr, l, r) stack.push(mid-1, l, r, mid+1) } } }
function countingSort (arr) { let n = arr.length if (n <= 1) return arr let min = Math.min.apply(null, arr) let max = Math.max.apply(null, arr) if (min === max) return arr let count = {} for (let i = 0; i < n; i++) { count[arr[i]] = count.hasOwnProperty(arr[i]) ? count[arr[i]] + 1 : 1 } let res = [] for (let i = min; i <= max; i++) { while(count[i]--) { res.push(i) } } return res }
function bucketSort(arr, bucket) { var n = arr.length; var result = []; if(n <= 1) return arr; bucket = bucket || 1; // 找到数组最大和最小值 var min = Math.min.apply(null, arr), max = Math.max.apply(null, arr); if(min === max) return arr; // 每一个桶的范围 var f = (max - min + 1) / bucket; var mybucket = new Array(bucket); for(var i = 0; i < n; i++) { var index = Math.floor((arr[i] - min)/f); mybucket[index] = mybucket[index] || []; var currbucket = mybucket[index]; currbucket.push(arr[i]); var k = currbucket.length - 2; while(k >= 0 && currbucket[k] > arr[i]) { currbucket[k+1] = currbucket[k]; k--; } currbucket[k+1] = arr[i] } for(var i = 0; i < bucket; i++) { if(mybucket[i]) result = result.concat(mybucket[i]) } return result }