前言
排序算法是笔试中经常出现的,提起排序算法就一定要提下算法复杂度和大O表示法,可参考文章 算法复杂度和大O表示法
冒泡排序
冒泡排序的空间复杂度是 0(n²) 。从运行时间来看,冒泡排序是排序算法中效率最差的一个。冒泡排序是比较任何两个相邻的项,如果第一个比第二个大,则交换它们。元素向上移动至正确的顺序,就好像气泡升至表面一样,冒泡排序因此得名。
function bubbleSort(arr) {
for (let i = 0; i < arr.length - 1; i++) {
for (let j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1)
}Ï
}
}
}
选择排序
选择排序的复杂度为 O(n²)。选择排序和冒泡排序一样,它包含镶嵌的两个循环,导致了二次方的复杂度。
选择排序算法是一种原址比较排序算法。选择排序大致的思路是找到数据结构中的最小值并将其放置在第一位,接着找到第二小的值并将其放到第二位,以此类推。
function swap(arr, a, b) {
let temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
return arr
}
function selectSort(arr) {
for (let i = 0; i < arr.length - 1; i++) {
let min = arr[i];
let minIndex = i;
for (let j = i; j < arr.length; j++) {
if (min > arr[j]) {
min = arr[j];
minIndex = j;
}
}
swap(arr, i, minIndex)
}
}
插入排序
插入排序的算法复杂度为 O(n²) 。插入排序每次排一个数组项,以此方式构建最后的排序数组。插入排序的核心思想是局部有变。排序小型数组时,此算法比选择排序和冒泡排序性能好。
function insertSort(arr) {
var len = arr.length;
var j, temp;
for (var i = 1; i < len; i++) {
j = i;
temp = arr[i];
while (i > 0 && arr[j - 1] > temp) {
arr[j] = arr[j - 1];
j--;
}
arr[j] = temp
}
return arr;
}
快速排序
快速排序的时间复杂度为O(nlog^n),且性能更好。快速排序采用分治的方法,将原始数组分为较小的数组。
function quickArr(arr) {
if (arr.length <= 1) {
return arr;
}
var left = [],
right = [];
var pIndex = Math.floor(arr.length / 2);
var p = arr.splice(pIndex, 1)[0];
for (var i = 0; i < arr.length; i++) {
if (arr[i] <= p) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
// 递归
return quickArr(left).concat([p], quickArr(right));
}
希尔排序
希尔排序是插入排序的一种高效改进版。
以上为比较重要和面试中比较常见的几种排序算法