一、直接插入排序介绍
ストレート挿入ソートの基本的な考え方は、ソートされるn個の要素を順序付きリストと順序なしリストとして扱うことです。最初は、順序付きリストには1つの要素のみが含まれ、順序なしリストにはn-1個の要素が含まれます。並べ替えプロセス中に、最初の要素が順序なしリストから取得され、順序付きリストに挿入されます。新しい順序付きリスト。n-1回繰り返して並べ替えプロセスを完了します。
編集者は私自身のlinuxC / C ++言語技術交換グループを推奨しています:[ 1106675687 ]グループファイルで共有する方が良いと思う学習本とビデオ資料をいくつかまとめました。必要に応じて追加できます。
二、直接插入排序图文说明
ソートコードを直接挿入する
/*
* 直接插入排序
*
* 参数说明:
* a -- 待排序的数组
* n -- 数组的长度
*/
void insert_sort(int a[], int n)
{
int i, j, k;
for (i = 1; i < n; i++)
{
//为a[i]在前面的a[0...i-1]有序区间中找一个合适的位置
for (j = i - 1; j >= 0; j--)
if (a[j] < a[i])
break;
//如找到了一个合适的位置
if (j != i - 1)
{
//将比a[i]大的数据向后移
int temp = a[i];
for (k = i - 1; k > j; k--)
a[k + 1] = a[k];
//将a[i]放到正确位置上
a[k + 1] = temp;
}
}
}
直接挿入ソートの中間プロセスを以下に選択して説明します。{20,30,40,10,60,50}の最初の3つの数字が配置されていると仮定すると、それらは順番に並んでいます。次に、10を配置します。概略図は次のとおりです。この
図では、シーケンスは順序付けられた領域と無秩序な領域に分割されています。実行する必要のあるタスクは2つだけです。(1)無秩序な領域の最初の番号を取り出し、順序付けられた領域の対応する位置を見つけます。(2)無秩序な領域のデータを順序付けられた領域に挿入します。必要に応じて、順序付けられた領域の関連データをシフトします。
編集者は私自身のlinuxC / C ++言語技術交換グループを推奨しています:[ 1106675687 ]グループファイルで共有する方が良いと思う学習本とビデオ資料をいくつかまとめました。必要に応じて追加できます。
三、直接插入排序的时间复杂度和稳定性
直接挿入ソートの時間計算量直接挿入ソートの時間計算量はO(N2)です。ソートされているシーケンスにN個の番号があるとします。トラバーサルの時間計算量はO(N)です。トラバーサルはいくつ必要ですか?N-1!したがって、直接挿入ソートの時間計算量はO(N2)です。
直接挿入ソートの安定性
直接挿入ソートは安定したアルゴリズムであり、安定したアルゴリズムの定義を満たしています。アルゴリズムの安定性-シーケンスにa [i] = a [j]があると仮定します。ソート前の場合、a [i]はa [j]の前にあり、ソート後、a [i]はまだa [j]の前にあります。そうすれば、このソートアルゴリズムは安定しています!
四、直接插入排序实现
直接挿入ソートC実装
実装コード(insert_sort.c)
View Code
直接挿入ソートC ++実装
実装コード(InsertSort.cpp)
View Code
直接挿入ソートJava実装
実装コード(InsertSort.java)
View Code
上記の3つの実装の原理と出力結果は同じです。それらの出力は次のとおりです。
before sort:20 40 30 10 60 50
after sort:10 20 30 40 50 60