私は要素がピボットと等しいゾーンを区切るためのインデックスとして "m1"と "m2"を使用して、3ウェイパーティションテクニックでクイックソートアルゴリズムを実装しようとしています。 は、ここに私のコードです:クイックソート3ウェイ分割
public class Sorting {
private static Random random = new Random();
private static int[] partition3(long[] a, int l, int r) {
long x = a[l];
int m1 = l;
int m2 = l;
for (int i = l + 1; i <= r; i++) {
if (a[i] < x) {
m1++;
m2++;
swap(a, m1, m2);
}
if (a[i] == x) {
m2++;
swap(a, i, m1);
}
}
swap(a, l, m1);
int[] m = {m1, m2};
return m;
}
private static void swap(long[] a, int i, int j) {
long temp = a[i];
a[i] = a[j];
a[j] = temp;
}
private static void randomizedQuickSort(long[] a, int l, int r) {
if (l >= r) {
return;
}
int k = random.nextInt(r - l + 1) + l;
long t = a[l];
a[l] = a[k];
a[k] = t;
int m[] = partition3(a, l, r);
randomizedQuickSort(a, l, m[0] - 1);
randomizedQuickSort(a, m[1] + 1, r);
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
long[] a = new long[n];
for (int i = 0; i < n; i++) {
a[i] = scanner.nextLong();
}
randomizedQuickSort(a, 0, n - 1);
for (int i = 0; i < n; i++) {
System.out.print(a[i] + " ");
}
}
}
倍の大半を、それは私のテストに正しい答えを出力し、時にはません。誰かが私が間違っていることを教えてもらえますか?
デバッガを使用する方法を学びます。 – gsamaras
あなたのコードが失敗しているケースの例を教えてください。 – UnknowableIneffable
私はあなたの問題を理解しました – UnknowableIneffable