0
私はバイナリー挿入ソートを使用して配列をソートする必要があります。 これは私が思いついた解決策であるが、それは遅すぎる:私は、私が試してみましたSystem.arraycopyのメソッドを使用することを推奨されていましたJava - バイナリー挿入ソート、トラブルシューティング
public static void binaryInsertionSort(int[] a) {
int ins, i, j;
int tmp;
for (i = 1; i < a.length; i++) {
ins = BinarySearch (a, 0, i, a[i]);
if(ins < i) {
tmp = a[i];
for (j = i - 1; j >= ins; j--)
a[j+1] = a[j];
a[ins] = tmp;
}
}
}
private static int BinarySearch(int[] a, int low, int high, int key) {
int mid;
if (low == high)
return low;
mid = low + ((high - low)/2);
if (key > a[mid])
return BinarySearch (a, mid + 1, high, key);
else if (key < a[mid])
return BinarySearch (a, low, mid, key);
return mid;
}
、それが動作していない理由を私は理解していない:
public static void binaryInsertionSort(int[] a) {
int ins, i;
int tmp = a[i];
for (i = 1; i < a.length; i++) {
ins = binarySearch (a, 0, i, a[i]);
if(ins < i){
System.arraycopy(a, ins, a, ins + 1, i - ins);
a[ins] = tmp;
}
}
}
private static int binarySearch(int[] a, int low, int high, int key) {
int mid;
if (low == high)
return low;
mid = low + ((high - low)/2);
if (key > a[mid])
return binarySearch (a, mid + 1, high, key);
else if (key < a[mid])
return binarySearch (a, low, mid, key);
return mid;
}
助けてください。
ことはあなたのコード**あなたは**実行したときに何が起こるかを説明してフル**を入れてください。 **あなたがどのデータを扱うかを示す[mcve]と、期待/実際の結果がどのように見えるか – GhostCat
最初に書いたオリジナルのコードは、私にとっては大丈夫です。バイナリの挿入の並べ替えは、最後にO(n^2)時間の複雑さを要します。 r 2番目の実装作業ですか? system.arraycopyを使って2番目の実装を作ったとしても、プログラムが大幅に高速化するとは思えません。高速で実行されるソートアルゴリズムについては、O(nlogn)アルゴリズムの1つを使用してください。 –
私の質問は、2番目のコードを動作させることに関するものでした。 はい、初期コードは動作しますが、System.arraycopyメソッドは元のコードより約4倍高速です)) – elMatador