Partition が呼び出されるたびに、比例配列の中央値がピボットとして使用されるように、(Java で) QuickSort を変更したいと考えています。
k 番目に小さい要素 (この場合は中央値) を返す Java の中央値選択アルゴリズムがあります。Java には、すべて単独で機能し、配列をソートする大量のクイックソート アルゴリズムがあります。残念ながら、上記を達成するためにこれら2つを組み合わせることはできません...試してみると、通常、スタックオーバーフローエラーが発生します。
誰かコードを見せて、それがどのように行われるかを確認できますか?
ありがとう
編集:たとえば、これは私が使用しようとした中央値選択アルゴリズムです。
public int quickSelect(int[] A, int p, int r, int k) {
if (p==r) return A[p];
int q = Partition(A,p,r);
int len = q-p+1;
if (k == len) return A[q];
else if (k<len) return Select(A,p,q-1,k);
else return Select(A,q+1,r,k-len);
}
public int partition(int[]A, int p, int r) {
int x = A[r];
int i = p-1;
for (int j = p; j<=r-1; j++) {
if (A[j] <= x) {
i++;
swap(A,i,j);
}
}
swap(A,i+1,r);
return i+1;
}
それ自体は機能しますが、使用するピボットを返すためにクイックソートのパーティション関数を介して quickSelect を呼び出そうとすると、機能しません。明らかに私は何か間違ったことをしているのですが、私には何がわかりません。残念ながら、インターネット上では、疑似コードであっても、中央値選択とクイックソートを組み合わせるアルゴリズムは見つかりませんでした。