Algorithm 通过快速排序算法排序后更改重复项的顺序

Algorithm 通过快速排序算法排序后更改重复项的顺序,algorithm,sorting,data-structures,quicksort,Algorithm,Sorting,Data Structures,Quicksort,我在某处读到(抱歉,我不记得在哪里)正确的排序算法应该按照重复值在未排序序列中出现的顺序对其进行排序 例如: 5(A)、2、4、5(B)、6、5(C)、1、3 5(A/B/C):这里A、B和C仅用于表示5的顺序 5(A):三个5中的前5个 5(B):三个5中的第二个5 5(C):三个5中的第三个5 排序后,上述列表应为: 1、2、3、4、5(A)、5(B)、5(C)、6 但快速排序给出了以下排序顺序: 1、2、3、4、5(C)、5(A)、5(B)、6 代码: void sort(int[] ar

我在某处读到(抱歉,我不记得在哪里)正确的排序算法应该按照重复值在未排序序列中出现的顺序对其进行排序

例如:

5(A)、2、4、5(B)、6、5(C)、1、3

5(A/B/C):这里A、B和C仅用于表示5的顺序

5(A):三个5中的前5个

5(B):三个5中的第二个5

5(C):三个5中的第三个5

排序后,上述列表应为:

1、2、3、4、5(A)、5(B)、5(C)、6

但快速排序给出了以下排序顺序:

1、2、3、4、5(C)、5(A)、5(B)、6

代码:

void sort(int[] array, int startIndex, int endIndex){
            int right = endIndex;
            int pivot = array[(startIndex+endIndex)/2];
            int left = startIndex;
            int temp;
            while(left <= right){ 
                while(array[right] > pivot){
                    right--;
                }
                while(array[left] < pivot){
                    left++;
                }
                if(left <= right){
                    temp = array[right];
                    array[right] = array[left];
                    array[left] = temp;
                    left++;
                    right--;
                }
            }
            if(startIndex < right) {
                sort(array, startIndex, right);
            }
            if(endIndex > left) {
                sort(array, left, endIndex);
            }
    }
void排序(int[]数组、int startIndex、int endIndex){
int right=endIndex;
int pivot=array[(startIndex+endIndex)/2];
int left=起始索引;
内部温度;
while(左枢轴){
对--;
}
while(数组[左]
这种行为正确吗?如果没有,那么可以做些什么来获得正确的输出,其中重复元素的顺序与未排序的顺序相同

编辑:


保持重复元素相对顺序的算法称为Dukeling在注释中通知的算法。

快速排序不是一个稳定的算法。如果希望保留排序顺序,请使用稳定的算法。Mergesort是一种稳定的排序算法。

告诉我们,一种保持相等项目相对顺序的排序算法称为“稳定”。高度相关或重复:@Dukeling感谢您提供此信息。“知道如何进行稳定的快速排序吗?”杜克林感谢你指出错误。QuasRoad在其高效实现中确实不能稳定。上面提到的问题,并提几个替代方案:(a)在比较元素时存储和考虑每个元素的原始索引,意味着具有相等密钥的元素将不再被认为是相等的,(b)在链表上快速排序,(c)使用O(n)额外空间-创建一个临时数组,而不是交换,从每一侧开始一次,按顺序将较小/较大的元素添加到临时数组的正确一侧,然后将其复制回来(或者其他方法也可以)。