稳定排序的概念:
保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。
例如:a[i]==a[j]&&i
通常的快速排序为什么不稳定?
快速排序初始的版本:
int partition(vector<int>&a, int s, int e) {
if (s < e) {
int low = s, high = e, key = a[s];
while (low < high) {
while (low < high && a[high] >= key)
high--;
if (low < high) {
a[low++] = a[high];//将比key小的元素移到低端
}
while (low < high && a[low] < key)
low++;
if (low < high) {
a[high--] = a[low];//将比key大的元素移到高端
}
}
a[low] = key;
return low;
}
return -1;
}
void quick_sort(vector<int> & a,int s, int e) {
if (s < e) {
int k = partition(a, s, e);
quick_sort(a, s, k);
quick_sort(a, k + 1,e);
}
}
看看交换导致的不稳定:
以下是初始序列(第一行是在原始数组的下标,第二行是元素值,若有第三行是当前数组的下标):
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
34 | 21 | 53 | 8 | 78 | 123 | 21 | 53 | 34 | 111 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
说明:low,high指的下标都是第三行当前数组内的下标。
1)以34为key进行划分,low=0,high=9:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
34 | 21 | 53 | 8 | 78 | 123 | 21 |