InsertionSort前InsertionSort前BinaryInsertionSort
-
23-09-2019 - |
質問
私はカップルでのご質問に関する異なる実装の挿入並べ替えができます。
実施1:
public static void insertionSort(int[] a) {
for (int i = 1; i < a.length; ++i) {
int key = a[i];
int j = i - 1;
while (j >= 0 && a[j] > key) {
a[j + 1] = a[j];
--j;
}
a[j + 1] = key;
}
}
実施2:
public static void insertionSort(int[] a) {
for (int i = 1; i < a.length; ++i) {
for (int j = i; j > 0 && a[j - 1] > a[j]; --j) {
swap(a, j, j - 1);
}
}
}
private static void swap(int[] a, int i, int j) {
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
ここでの私の最初の質問:一考慮しなおす必要がありそうだが、最初のバージョンは少し高速のバージョン(が少な課題)しかし、その先には、少なくともその差が無視できる).でも、なぜでしょう?
第二に、思るJava配列.sort()メソッドにも使用して第二のアプローチ(その他なんでもコードの再利用のためのスワップの手法を用いて、しかもわかりやすい).
実施3(binaryInsertionSort):
public static void binaryInsertionSort(int[] a) {
for (int i = 1; i < a.length; ++i) {
int pos = Arrays.binarySearch(a, 0, i, a[i]);
int insertionPoint = (pos >= 0) ? pos : -pos - 1;
if (insertionPoint < i) {
int key = a[i];
// for (int j = i; i > insertionPoint; --i) {
// a[j] = a[j - 1];
// }
System.arraycopy(a, insertionPoint, a, insertionPoint + 1, i - insertionPoint);
a[insertionPoint] = key;
}
}
}
は、バイナリの挿入ソートの実用的な利用、または理論的なこんなことをしたのだろう。小アレイ、その他のアプローチをより高速に、大きなアレイmergesort/quicksortしています。
解決
- 削除請求項false
- 数の比較では最初の二つの1/2*n(n-1)を除いたもので、外部タイルです。
- これらのプログラムのようなリアルとしても、なんの情報を使用で廃棄します。たとえば、簡単に追加する"ボタンをクリックすると内側のループを参照する場合スワップについてない場合にはその配列はソートされ、仕上げることができな省のです。実際には、これらの種類の検討を独占できるの平均値。
Postscript の質問Javaに関して:理解しているJavaのソートでは、問題が発生する複雑なアルゴリズムを使用する多くの特別な場合など、専門分別ケース小型配列を使用quicksortい、重いものを持ち上げる.
所属していません StackOverflow