我正在为一个数组中的字符串开发一个快速排序程序,我不确定我做错了什么 - 它打印出错误的答案。
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次。请帮忙!
答案 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);
}
}
我尽可能地坚持原始实施。正如彼得所说,原始代码有几个问题,但如果你比较微妙的差异,我认为它是有道理的。