Java QuickSort错误

时间:2014-02-20 05:47:54

标签: java quicksort

我正在为一个数组中的字符串开发一个快速排序程序,我不确定我做错了什么 - 它打印出错误的答案。

    public static void quickSort(String[] s, int beg, int end){
    int i = beg, j = end;

    if(end-beg >= 1){ 
        String piv = s[beg];
        while(j > i){
            while(s[j].compareTo(piv) > 0 && j >= i && i >= beg)
                j--;
            while(s[i].compareTo(piv) <= 0 && j > i && i <= end)
                i++;
            if(j > i){
                String temp = s[i];          
                s[i] = s[j];     
                s[j] = temp;          
            }

            for(String k : s)
                System.out.print(k);
            System.out.println();

            quickSort(s, beg, j-1);
            quickSort(s, j+1, end); 

        }
    }

如果我输入{r, t, c, x, a, w, p},我会得到 r p c x a w t重复了14次。请帮忙!

2 个答案:

答案 0 :(得分:0)

这里有很多问题,你用过i,你的意思是j和j,你的意思是我至少两次。如果你按照wikipedia上的inplace quick sort进行操作,你实际上并不需要同时保留i和j。我建议从头开始,按照下面的维基百科的puesdo代码:

  // left is the index of the leftmost element of the subarray
  // right is the index of the rightmost element of the subarray (inclusive)
  // number of elements in subarray = right-left+1
  function partition(array, left, right, pivotIndex)
     pivotValue := array[pivotIndex]
     swap array[pivotIndex] and array[right]  // Move pivot to end
     storeIndex := left
     for i from left to right - 1  // left ≤ i < right
         if array[i] <= pivotValue
             swap array[i] and array[storeIndex]
             storeIndex := storeIndex + 1  // only increment storeIndex if swapped
     swap array[storeIndex] and array[right]  // Move pivot to its final place
     return storeIndex

答案 1 :(得分:0)

试试这段代码:

private static void quickSort(String[] s, int beg, int end) {
    int i = beg, j = end;

    if (end-beg >= 1) {
        String piv = s[beg];
        while (j >= i) {
            while (s[i].compareTo(piv) < 0) {
                i++;
            }
            while (s[j].compareTo(piv) > 0) {
                j--;
            }
            if (j >= i) {
                String temp = s[i];
                s[i] = s[j];
                s[j] = temp;
                i++;
                j--;
            }
        }

        for(String k : s)
            System.out.print(k);
        System.out.println();

        quickSort(s, beg, j);
        quickSort(s, i, end);

    }
}

我尽可能地坚持原始实施。正如彼得所说,原始代码有几个问题,但如果你比较微妙的差异,我认为它是有道理的。