跳转至

ch13 排序

1. 快速排序

快速排序就是将所有元素逐个转换为轴点的过程。轴点必定已然就位,一个序列有序,当且仅当所有元素皆为轴点。

常用的轴点选取策略有随机选取三者取中

2. 希尔排序

将整个序列视作一个矩阵,逐列各自排序。

【递减增量】

  • 由粗到细:重排矩阵,使其更窄,再次逐列排序
  • 逐步求精:如此往复,直至矩阵变成一列,最后一次迭代,等同于全排序

【步长序列】由各矩阵宽度逆向排列而成的序列。

C++
template <typename T> 
void Vector<T>::shellSort(Rank lo, Rank hi) {
    for (Rank d = 0x7FFFFFFF; 0 < d; d >>= 1) //PS Sequence: 1, 3, 7, 15, 31, ...
        for (Rank j = lo + d; j < hi; j++) { //for each j in [lo+d, hi)
            T x = _elem[j]; Rank i = j;//within the prefix of the subsequence of [j]
            while ((lo + d <= i) && (x < _elem[i-d])) //find the appropriate
                _elem[i] = _elem[i-d], i-= d; //predecessor [i]
            _elem[i] = x; //where to insert [j]
        }
}