我知道有几个类似的帖子,但没有一个答案令人满意,这就是我想再问这个问题的原因。
请考虑以下代码。根据CRLS算法简介
,这是我的快速排序实现int partition(int* a, int s, int e)
{
int pivot = a[e];
int q = s-1;
for (int i = s; i <= e; i++)
{
if (a[i] <= pivot) {
q++;
int tmp = a[q];
a[q] = a[i];
a[i] = tmp;
}
}
return q;
}
void quickSort(int* a, int s, int e)
{
if (e > s) {
int q = partition(a, s, e);
quickSort(a, s, q-1);
quickSort(a, q+1, e);
}
}
稳定的排序算法使用相等的键(即值)保持记录的相对顺序。我不明白为什么快速排序不是其中之一。尽管其中不相邻的元素之间存在交换,但我仍然不明白为什么会导致不稳定。 我真的希望有人可以举例说明这一点。
谢谢。
答案 0 :(得分:2)
在稳定排序算法中,交换或弹簧仅发生在相邻元素上。 例如,在mergesort中,元素被组成一个单元,然后使用合并函数进行相应的排序。我认为如果你考虑线性排序,它的自我解释。但快速排序并非如此。
答案 1 :(得分:0)
尝试[1,1,1,5,5,5,5, 1 ,1,1,4], 枢轴是4,当我遇到更强的“1”时,它会交换 前5个用这个“1”