按Quicksort算法排序后,按重复顺序更改

时间:2017-05-09 19:40:00

标签: 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(C):三个5中的第3个

排序后,上面的列表应为:

  

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

但Quicksort给出了以下排序顺序:

  

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);
            }
    }

这种行为是否正确?如果没有,那么可以做些什么来获得正确的输出,其中重复元素的排序与未排序的顺序相同?

编辑:

维护重复元素相对排序的算法称为'Stable sort'.,由Dukeling在评论中提供。

1 个答案:

答案 0 :(得分:2)

Quicksort不是一个稳定的算法。如果要保留排序顺序,请使用稳定的算法。 Mergesort是一种稳定的排序算法。