常见算法
1.选择排序
思路如下:
- 在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
- 从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
- 重复第二步,直到所有元素均排序完毕
function selectionSort(arr) { var len = arr.length; var minIndex, temp; for (var i = 0; i < len - 1; i++) { minIndex = i; for (var 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; } // 示例使用 var arr = [64, 25, 12, 22, 11]; console.log('Before sort: ', arr); // [64, 25, 12, 22, 11] console.log('After sort: ', selectionSort(arr)); // [11, 12, 22, 25, 64]
2.冒泡排序
思路如下:
-
比较相邻的元素,如果第一个比第二个大,就交换它们两个
-
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数
-
针对所有的元素重复以上的步骤,除了最后一个
-
重复上述步骤,直到没有任何一堆数字需要比较
function bubbleSort(arr) { var len = arr.length; for (var i = 0; i < len; i++) { for (var j = 0; j < len - 1 - i; j++) { if (arr[j] > arr[j + 1]) { // 相邻元素两两对比 var temp = arr[j + 1]; // 元素交换 arr[j + 1] = arr[j]; arr[j] = temp; } } } return arr; } // 示例使用 var arr = [64, 33, 24, 10, 100, 50]; console.log('原始数组: ' + arr); var sortedArr = bubbleSort(arr); console.log('排序后数组: ' + sortedArr);
3.插入排序
思路如下:
- 把待排序的数组分成已排序和未排序两部分,初始的时候把第一个元素认为是已排好序的
- 从第二个元素开始,在已排好序的子数组中寻找到该元素合适的位置并插入该位置(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
- 重复上述过程直到最后一个元素被插入有序子数组中
function insertionSort(arr) { for (let i = 1; i < arr.length; i++) { let key = arr[i]; let j = i - 1; // 移动元素并查找插入点 while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; j = j - 1; } arr[j + 1] = key; } return arr; } // 示例使用 const arr = [10, 2, 9, 3, 8, 4, 7, 5, 6]; const sortedArr = insertionSort(arr); console.log(sortedArr); // 输出: [2, 3, 4, 5, 6, 7, 8, 9, 10]
4.归并排序
思路如下:
- 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
- 设定两个指针,最初位置分别为两个已经排序序列的起始位置
- 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
- 重复步骤3直到某一指针到达序列尾
- 将另一序列剩下的所有元素直接复制到合并序列尾
function mergeSort(arr) { if (arr.length <= 1) { return arr; } const middle = Math.floor(arr.length / 2); const left = arr.slice(0, middle); const right = arr.slice(middle); return merge(mergeSort(left), mergeSort(right)); } function merge(left, right) { let result = []; while (left.length && right.length) { if (left[0] <= right[0]) { result.push(left.shift()); } else { result.push(right.shift()); } } while (left.length) result.push(left.shift()); while (right.length) result.push(right.shift()); return result; } // 使用示例 const unsortedArray = [4, 3, 2, 10, 12, 1, 5, 6]; const sortedArray = mergeSort(unsortedArray); console.log(sortedArray); // 输出: [1, 2, 3, 4, 5, 6, 10, 12]
5.快速排序
思路如下:
- 从数列中挑出一个元素,称为"基准"(pivot)
- 重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任何一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作
- 递归地(recursively)把小于基准值元素的子数列和大于基准值元素的子数列排序
function quickSort(arr) { if (arr.length <= 1) { return arr; } const pivotIndex = Math.floor(arr.length / 2); const pivot = arr.splice(pivotIndex, 1)[0]; const left = []; const 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)); } // 使用示例 const arr = [3, 6, 8, 10, 1, 2, 1, 4, 7, 9]; console.log(quickSort(arr)); // 输出: [1, 1, 2, 3, 4, 6, 7, 8, 9, 10]
总结: