总结:关于排序算法

以下具体算法中描述的均是升序排序

复杂度分析请结合具体算法(点击排序方式可到对应博客)

排序方式 平均时间复杂度 最优时间复杂度 最差时间复杂度 空间复杂度 稳定性
冒泡排序 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;
}
posted @ 2021-02-23 17:37  有机物与鱼  阅读(27)  评论(0编辑  收藏  举报