私はInsertionsortを理解しようとしています。私はセンチネルで改善できると聞いています。InsertionsortとSentinels
これはセンチネルのない私のコードです:
public static int[] insertionSort(int[] sortieren) {
int temp;
for (int i = 1; i < sortieren.length; i++) {
temp = sortieren[i];
int j = i;
while (j > 0 && sortieren[j - 1] > temp) {
sortieren[j] = sortieren[j - 1];
j--;
}
sortieren[j] = temp;
}
return sortieren;
}
私はにArrayIndexOutOfBounds例外を取得することができ、その場合に理解することは、現在しようとしています。なぜコードを改善するために必要なSentinelがあるのか、どこに入力しなければならないのか理解できるようになりますか?私は配列の左端にInteger.MIN_Valueを置く必要があると言いますが、配列が不足しているケースがないので、わかりません。
私がInsertionsortのセンチネルの使い方を理解するのを助けていただければ幸いです。センチネルで
...
public void insertionSort(int[] array) {
int temp;
int arraySentinel[] = new int[array.length+1];
for(int i = 0; i < array.length; i++){
arraySentinel[i+1] = array[i];
}
arraySentinel[0] = Integer.MIN_VALUE;
for (int i = 1; i < arraySentinel.length; i++) {
temp = arraySentinel[i];
int j = i;
/**
* Stabil weil sortieren[j-1] > temp!
* Wäre nicht stabil wenn >=!
*/
while (arraySentinel[j - 1] > temp) {
arraySentinel[j] = arraySentinel[j - 1];
j--;
}
arraySentinel[j] = temp;
}
for (int i = 1; i < arraySentinel.length; i++){
array[i-1] = arraySentinel[i];
}
}
ありがとうございました。しかし、私がこのSentinelを実装したいのであれば、長さ+1の新しい配列を作成します。または、これをより良い方法で実装できますか?トピックに新しいコードを追加しました。 –
あなたの実装は正しいようです。私は全体的な複雑さに何ら差異をもたらさないので、どのように見えるかは分かりません。しかし、あなたはオーバーヘッド定数を減らすだけで、漸近的な複雑さを減らすことはできません。実際、インサート・ソートは、インナー・ループがごくわずかな定数とスワップを使用して非常に効率的であるため、広く使用されています。 –
ありがとうございます。最終的に私はそれを得た!おそらく、ArrayList mhmを使って作業するほうが良いでしょう。私は新しいコードを追加しました、今、その罰金を望みます:) –