这是代码。输出是一个非常接近正确排序的数组,但有几个元素乱序。有人能发现错误吗?
我很确定swap和quicksort方法是正确的,但我在这里发布所有方法以防万一。
package quicksort;
import java.util.Random;
import java.util.Arrays;
public class QuickSort {
/**
* @param args the command line arguments
*/
private static int[] u;
public static void main(String[] args) {
u = makeArray(100);
System.out.println(Arrays.toString(u));
quicksort(0, u.length - 1);
System.out.println(Arrays.toString(u));
}
public static int[] makeArray(int n) {
int[] a = new int[n];
int j;
Random r = new Random();
for (int i = 0; i < n; i++) {
j = (r.nextInt(100) + 1);
a[i] = j;
}
return a;
}
public static int partition(int left, int right, int pivot) {
int p = pivot; // pivot
int lPt = left - 1;
int rPt = right + 1;
while (true) {
while ((lPt < right) && (u[++lPt] < p));
while ((rPt > left) && (u[--rPt] > p));
if (lPt >= rPt) {
break;
} else {
swap(lPt, rPt);
System.out.println("Swapping " + lPt + " " + rPt);
}
}
return lPt;
}
public static void swap (int a, int b) {
int temp = u[a];
u[a] = u[b];
u[b] = temp;
}
public static void quicksort(int l, int r) {
if (r - l <= 0) {
return;
} else {
int part = partition(l, r, u[l]);
quicksort (l, part - 1);
quicksort (part + 1, r);
}
}
}
答案 0 :(得分:2)
问题在于分区方法。枢轴元件未放置在交换结束时的正确位置。我已经更改了方法签名,以便传入pivot元素的位置,而不是pivot的值,所以在quicksort()中你现在可以写:
int part = partition(l, r, l);
在pivot方法的主体中,我将pivot元素交换到了section的末尾(通过右键交换)。因此我们用掉交忽略了这个元素,在rPT初始化时我拿走了“+ 1”。然后我在while循环后添加了一个语句,将pivot元素移动到位。通过这三个更改,该方法现在看起来像这样:
public static int partition(int left, int right, int pivotPosition) {
int p = u[pivotPosition]; // pivot
// Move pivot to the end
swap(pivotPosition, right);
int lPt = left - 1;
int rPt = right;
while (true) {
while ((lPt < right) && (u[++lPt] < p));
while ((rPt > left) && (u[--rPt] > p));
if (lPt >= rPt) {
break;
} else {
swap(lPt, rPt);
System.out.println("Swapping " + lPt + " " + rPt);
}
}
// Put pivot in its place
swap(lPt, right);
return lPt;
}
通过这些更改,代码适用于我。
答案 1 :(得分:0)
您必须在左侧列表中找到一个大于pivot元素的值,并在右侧列表中找到一个小于pivot元素的值,然后我们交换值。
package quicksort;
import java.util.Random;
import java.util.Arrays;
public class QuickSort {
/**
* @param args the command line arguments
*/
private static int[] u;
public static void main(String[] args) {
u = makeArray(10);
System.out.println(Arrays.toString(u));
quicksort(0, u.length - 1);
System.out.println(Arrays.toString(u));
}
public static int[] makeArray(int n) {
int[] a = new int[n];
int j;
Random r = new Random();
for (int i = 0; i < n; i++) {
j = (r.nextInt(100) + 1);
a[i] = j;
}
return a;
}
private static void quicksort(int low, int high) {
int i = low, j = high;
int pivot = u[low];
while (i <= j) {
while (u[i] < pivot) {
i++;
}
while (u[j] > pivot) {
j--;
}
if (i <= j) {
exchange(i, j);
i++;
j--;
}
}
if (low < j) {
quicksort(low, j); // note here
}
if (i < high) {
quicksort(i, high); // note here
}
}
private static void exchange(int i, int j) {
int temp = u[i];
u[i] = u[j];
u[j] = temp;
}
}