复试准备 - 数据结构 - 第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)
需要非常有效率的随机存取