1、选择排序 第一次从数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 /* 选择排序 */ function selectionSort(arr) { let len = arr.length; let minIndex, temp; for (let i = 0; i < len - 1; i++) { minIndex = i; for (let j = i + 1; j < len; j++) { if (arr[j] < arr[minIndex]) { // 寻找最小的数 minIndex = j; // 将最小数的索引保存 } } temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; } return arr; }
2、快速排序
在数据中找一项作为基准
比基准数大的放右边,小的放左边 (基准的位置是正确的)
把左右两边再分别这样划分排序,直到左右两边只有一项
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 /* 快速排序 */ let quickSort = (array) => { if (array.length <= 1) { return array } let pivotIndex = Math.floor(array.length / 2) let pivot = array.splice(pivotIndex, 1)[0] let left = [] let right = [] for (let i = 0; i < array.length; i++) { if (array[i] < pivot) { left.push(array[i]) } else { right.push(array[i]) } } return quickSort(left).concat([pivot], quickSort(right)) }
3、归并排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 /* 归并排序 */ let mergeSort = (array) => { if (array.length === 1) { return array } let left = array.slice(0, Math.floor(array.length / 2)) let right = array.slice(Math.floor(array.length / 2)) return merge(mergeSort(left), mergeSort(right)) } let merge = (a, b) => { if (a.length === 0) { return b } if (b.length === 0) { return a } return a[0] > b[0] ? [b[0]].concat(merge(a, b.slice(1))) : [a[0]].concat(merge(a.slice(1), b)) }
4、计数排序
使用哈希表将数据对应起来,重复次数作为哈希表对应 key 的 value
遍历哈希表,对于哈希表的每个 key,遍历对应的 value 次
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 /* 计数排序 */ let countSort = (array) => { let hashTable = {}, max = 0, result = [] for (let i = 0; i < array.length; i++) { if (!(array[i] in hashTable)) { hashTable[array[i]] = 1 } else { hashTable[array[i]] += 1 } if (array[i] > max) { max = array[i] } } for (let i = 0; i <= max; i++) { if (i in hashTable) { for (let j = 0; j < hashTable[i]; j++) { result.push(i) } } } return result }