复试准备 - 数据结构 - 第2章 - 排序

快速排序

优点:
好写
局部性好
空间复杂度平均为O(logn)

缺点:
不稳定
朴素地选择第一个元素或者最后一个元素容易退化
选择中间的元素不容易退化,但是对特定的序列仍然有可能退化

优势在于局部性原理,相邻几次调整的区间都几乎涉及同一片内存,所以比归并排序以及堆排序更优。

挺好记的。为什么要写>=呢,防止传入一个空数组的情况。

void QuickSort(int *a, int l, int r) {
    if(l >= r)
        return;
    int i = l - 1, j = r + 1, x = a[l + r >> 1];
    while(i < j) {
        while(a[++i] < x);
        while(a[--j] > x);
        if(i < j)
            swap(a[i], a[j]);
    }
    QuickSort(a, l, j);
    QuickSort(a, j + 1, r);
    return;
}

int KthElement(int *a, int l, int r, int k) {
    if(l >= r)
        return a[l];
    int i = l - 1, j = r + 1, x = a[l + r >> 1];
    while(i < j) {
        while(a[++i] < x);
        while(a[--j] > x);
        if(i < j)
            swap(a[i], a[j]);
    }
    if(j - l + 1 >= k)
        return KthElement(a, l, j, k);
    else
        return KthElement(a, j + 1, r, k - (j - l + 1));
}

堆排序

优点:
空间复杂度为O(1)
时间复杂度稳定为O(nlogn)

缺点:
不稳定
需要非常有效率的随机存取

归并排序

优点:
非常容易改用于链表排序
外部排序
稳定
时间复杂度稳定为O(nlogn)

缺点:
空间复杂度为O(n)
需要非常有效率的随机存取

posted @ 2020-04-01 02:14  KisekiPurin2019  阅读(116)  评论(0编辑  收藏  举报