一个神奇的快速排序算法
2018-11-13 本文已影响0人
修司敦
这个算法没有 swap 过程,直接把个别元素复制到了另一个位置,但是到最后依旧可以排序,而且没有丢失任何一个元素。我花了一上午模拟过程才明白了这个算法:
void QuickSort(vector<int>& v, int low, int high) {
if (low >= high) // 结束标志
return;
int first = low; // 低位下标
int last = high; // 高位下标
int key = v[first]; // 设第一个为基准
while (first < last)
{
// 将比第一个小的移到前面
while (first < last && v[last] >= key)
--last;
if (first < last)
v[first++] = v[last]; //这里是替换而不是交换
// 将比第一个大的移到后面
while (first < last && v[first] <= key)
++first;
if (first < last)
v[last--] = v[first]; //这里是替换而不是交换
}
// 基准置位
v[first] = key; //但是到这里的时候,数组里的元素只是换了位置,而没有丢失掉任何一个
// 前半递归
QuickSort(v, low, first - 1);
// 后半递归
QuickSort(v, first + 1, high);
}