为什么快速排序不稳定

时间:2014-01-14 05:39:13

标签: quicksort stability

我知道有几个类似的帖子,但没有一个答案令人满意,这就是我想再问这个问题的原因。

请考虑以下代码。根据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);
    }
}

稳定的排序算法使用相等的键(即值)保持记录的相对顺序。我不明白为什么快速排序不是其中之一。尽管其中不相邻的元素之间存在交换,但我仍然不明白为什么会导致不稳定。 我真的希望有人可以举例说明这一点。

谢谢。

2 个答案:

答案 0 :(得分:2)

在稳定排序算法中,交换或弹簧仅发生在相邻元素上。 例如,在mergesort中,元素被组成一个单元,然后使用合并函数进行相应的排序。我认为如果你考虑线性排序,它的自我解释。但快速排序并非如此。

答案 1 :(得分:0)

尝试[1,1,1,5,5,5,5, 1 ,1,1,4], 枢轴是4,当我遇到更强的“1”时,它会交换 前5个用这个“1”