2017-02-19 3 views
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; 
} 

助けてください。

+4

ことはあなたのコード**あなたは**実行したときに何が起こるかを説明してフル**を入れてください。 **あなたがどのデータを扱うかを示す[mcve]と、期待/実際の結果がどのように見えるか – GhostCat

+0

最初に書いたオリジナルのコードは、私にとっては大丈夫です。バイナリの挿入の並べ替えは、最後にO(n^2)時間の複雑さを要します。 r 2番目の実装作業ですか? system.arraycopyを使って2番目の実装を作ったとしても、プログラムが大幅に高速化するとは思えません。高速で実行されるソートアルゴリズムについては、O(nlogn)アルゴリズムの1つを使用してください。 –

+0

私の質問は、2番目のコードを動作させることに関するものでした。 はい、初期コードは動作しますが、System.arraycopyメソッドは元のコードより約4倍高速です)) – elMatador

答えて

0

まあ、その間、答えは私が思ったよりも簡単でした。 ローカル変数を間違った場所に初期化しました。代わりに:

正しい方法はにある:(

public static void binaryInsertionSort(int[] a) { 
    int ins, i; 
     for (i = 1; i < a.length; i++) { 
      **int tmp = a[i];** 
      ins = binarySearch (a, 0, i, a[i]); 
       if(ins < i){ 
        System.arraycopy(a, ins, a, ins + 1, i - ins); 
        a[ins] = tmp; 
       } 
    } 
} 

そして、それは動作します: