排序算法应该是程序猿应该掌握的最基本的算法吧, 下面就是最近整理的一些常用的排序算法, 写下来备忘。
1 | //基本变量、函数声明 |
插入排序
- 思路: 从 无序区 的第一个元素开始和它前面有序区的元素进行比较,
如果比前面的元素小,那么前面的元素向后移动,否则就将此元素插入到相应的位置。- 平均复杂度: O(n^2)
1 | Array.sortMethod('insertSort', function() { |
二分插入排序
在直接插入排序的基础上改进,其与直接插入排序算法最大的区别在于查找插入位置时使用的是二分查找的方式,在速度上有一定提升。
- 思路:先在 有序区 通过二分查找的方法找到移动元素的起始位置,然后通过这个起始位置将后面所有的元素后移。
- 平均复杂度: O(nlog n)
1 | Array.sortMethod('bInsertSort', function() { |
选择排序
- 思路: 在无序区中选出最小的元素,然后将它和无序区的第一个元素交换位置,数组逐渐变为有序区。
- 平均复杂度: O(n^2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Array.sortMethod('selectSort', function() {
var i, j, k, temp,
len = this.length;
for (i = 0; i < len - 1; i++) {
k = i;
for (j = i + 1; j < len; j++) {
if (this[k] > this[j]) k = j;
}
if (k != i) {
temp = this[i];
this[i] = this[k];
this[k] = temp;
}
}
return this;
});
冒泡排序
- 思路: 通过在无序区的相邻元素的比较和替换,使较小的元素浮到最上面
- 平均复杂度: O(n^2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Array.sortMethod('bubbleSort', function() {
var len = this.length,
i, j, temp;
for (i = 0; i < len - 1; i++) {
for (j = 0; j < len - 1 - i; j++) {
if (this[j] > this[j + 1]) {
temp = this[j];
this[j] = this[j + 1];
this[j + 1] = temp;
}
}
}
return this;
});
改进的冒泡排序
- 思路: 如果在某次的排序中没有出现交换的情况,那么说明在无序的元素现在已经是有序了,就可以直接返回了。
- 平均复杂度: O(n^2)
1 | Array.sortMethod('rBubbleSort', function() { |
快速排序
- 思路: 找一个数为基准元素, 把比基准元素大的放在其后面, 比基准元素小的放在其前面, 然后递归调用
- 平均复杂度: O(nlog n)
1 | Array.sortMethod('quickSort', function() { |
堆排序
- 思路:
- 初始堆:
将原始数组调整成大顶堆的方法——筛选算法:
比较R[2i]、R[2i+1]和R[i],将最大者放在R[i]的位置上(递归调用此方法到结束)- 堆排序:每次将堆顶元素与数组最后面的且没有被置换的元素互换。
- 平均复杂度: O(nlog n)
1 | Array.sortMethod('shiftDown', function(low, high) { //筛选大顶堆(把最大值的放在根节点上) |
希尔排序
- 思路: 在第 i 次时取gap = n/(2的i次方),然后将数组分为gap组(从下标0开始,每相邻的gap个元素为一组),接下来我们对每一组进行直接插入排序。
- 平均复杂度: O(nlog n) ~ O(n^2)
1 | Array.sortMethod('shellSort', function() { |
归并排序
- 思路:
从两个有序表R[low…mid]和R[mid+1…high],每次从左边依次取出一个数进行比较,将较小者放入temp数组中,
最后将两段中剩下的部分直接复制到temp中。这样temp是一个有序表, 递归(考虑最后一个子表的长度不足length的情况)- 平均复杂度: O(nlog n)
1 | Array.sortMethod('mergeSort', function() { |
测试用例
1 | a = [1, 5, 4, 8, 1, 6, 10, 23, 11, 53, 100, 2, 9]; |
result:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18insertSort:
[ 1, 1, 2, 4, 5, 6, 8, 9, 10, 11, 23, 53, 100 ]
selectSort:
[ 1, 1, 2, 4, 5, 6, 8, 9, 10, 11, 23, 53, 100 ]
bubbleSort:
[ 1, 1, 2, 4, 5, 6, 8, 9, 10, 11, 23, 53, 100 ]
rBubbleSort:
[ 1, 1, 2, 4, 5, 6, 8, 9, 10, 11, 23, 53, 100 ]
quickSort:
[ 1, 1, 2, 4, 5, 6, 8, 9, 10, 11, 23, 53, 100 ]
heapSort:
[ 1, 1, 2, 4, 5, 6, 8, 9, 10, 11, 23, 53, 100 ]
bInsertSort:
[ 1, 1, 2, 4, 5, 6, 8, 9, 10, 11, 23, 53, 100 ]
shellSort:
[ 1, 1, 2, 4, 5, 6, 8, 9, 10, 11, 23, 53, 100 ]
mergeSort:
[ 1, 1, 2, 2, 4, 5, 6, 8, 9, 10, 11, 23, 53, 100 ]