总结:关于排序算法
以下具体算法中描述的均是升序排序
复杂度分析请结合具体算法(点击排序方式可到对应博客)
排序方式 | 平均时间复杂度 | 最优时间复杂度 | 最差时间复杂度 | 空间复杂度 | 稳定性 |
---|---|---|---|---|---|
冒泡排序 | O(n2) | O(n2) | O(n2) | O(1) | 稳定 |
快速排序 | O(nlogn) | O(nlogn) | O(n2) | O(logn) | 不稳定 |
直接插入排序 | O(n2) | O(n) | O(n2) | O(1) | 稳定 |
希尔排序 | *O(n1.3) | *O(n) | *O(n2) | O(1) | 不稳定 |
简单选择排序 | O(n2) | O(n2) | O(n2) | O(1) | 不稳定 |
堆排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(1) | 不稳定 |
二路归并排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(n) | 稳定 |
计数排序 | O(n+m) | O(n+m) | O(n+m) | O(n+m) | 稳定 |
桶排序 | O(n + n(logn - logk)) | O(n) | O(n2) | O(n+k) | 稳定 |
基数排序 | O(d(n+r)) | O(d(n+r)) | O(d(n+r)) | O(n+r) | 稳定 |
注:n为待排序列长度,m为待排序列取值范围大小,k为桶数量,d为数组最高位数,r为基数 |
公用函数
// 交换array[i]和array[j]
function Swap(array, i, j) {
var temp = array[i];
array[i] = array[j];
array[j] = temp;
}
// 不需额外空间的两数交换
// 此处只是记录,下面并没有用过这个函数
function Swap_v2(a, b) {
a = a + b;
b = a - b;
a = a - b;
}
// 返回数组元素中的最高位数
function GetHighDigitTemp(array, radix) {
var len = array.length;
var max = array[0];
for (var i = 1; i < len; i++) {
if (array[i] > max) {
max = array[i];
}
}
var digit = 1;
for (; max >= radix; digit++) {
max /= radix;
}
return digit;
}