排序算法——JavaScript实现
排序算法 选择排序O(n^2) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 let min = (number ) => { if (number.length > 2 ) { return min([number[0 ], min(number.slice(1 ))]); } else { return Math .min.apply(null , number); } };let minIndex = (number ) => number.indexOf(min(number));let sort = (number ) => { if (number.length > 2 ) { let index = minIndex(number); let min = number[index]; number.splice(index, 1 ); return [min].concat(sort(number)); } else { return number[0 ] < number[1 ] ? number : number.reverse(); } };let minIndexCycle = (number ) => { let minIndex = 0 ; for (let i = 1 ; i < number.length; i++) { if (number[i] < number[minIndex]) minIndex = i; } return minIndex; };let swap = (number, a, b ) => { number[a] = number[a] ^ number[b]; number[b] = number[a] ^ number[b]; number[a] = number[a] ^ number[b]; return number; }let sortCycle = (number ) => { for (let i = 0 ; i < number.length - 1 ; i++) { console .log("------" ); console .log(`i:${i} ` ); let minIndex = minIndexCycle(number.slice(i)) + i; console .log(`minIndex:${minIndex} ` ); console .log(`min:${number[minIndex]} ` ); if (minIndex != i) swap(number, minIndex, i); console .log(`number:[${number} ]` ); } return number; };
快速排序O(nlog2n) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 let quickSort = arr => { if (arr.length <= 1 ) return arr; let pivotIndex = Math .floor(arr.length / 2 ); let pivot = arr.splice(pivotIndex, 1 )[0 ]; let left = []; let right = []; for (let i = 0 ; i < arr.length; i++) { if (arr[i] < pivot) { left.push(arr[i]); } else { right.push(arr[i]); } } return quickSort(left).concat([pivot], quickSort(right)); };
归并排序O(nlog2n) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 let mergeSort = arr => { if (arr.length === 1 ) { return arr; } console .log(`----` ); let left = arr.slice(0 , Math .floor(arr.length / 2 )); console .log(`left:${left} ` ); let right = arr.slice(Math .floor(arr.length / 2 ),); console .log(`right:${right} ` ); return merge(mergeSort(left), mergeSort(right)); };let merge = (left, right ) => { if (!left.length) return right; if (!right.length) return left; if (left[0 ] > right[0 ]) { return [right[0 ]].concat(merge(left, right.slice(1 ,))) } else { return [left[0 ]].concat(merge(left.slice(1 ,), right)); } };
计数排序O(n+max) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 let countSort = arr => { let count = {}, max = 0 , result = []; for (let index = 0 ; index < arr.length; index++) { if (!(arr[index] in count)) { count[arr[index]] = 1 ; } else { count[arr[index]] += 1 ; } if (arr[index] > max) max = arr[index]; } for (let value = 0 ; value <= max; value++) { if (value in count) { for (let i = 0 ; i < count[value]; i++) { result.push(value); } } } return result; }
各种排序方法的比较