1.原則
ソートされた順序付きリストにデータを挿入して、レコード数を1つ増やした新しい順序付きリストを作成します。
2.考える
直接挿入ソートは、順序付けられていないシーケンスのデータを順序付けられたシーケンスに挿入することです。順序付けられていないシーケンスをトラバースするときは、最初に順序付けられていないシーケンスの最初の要素を順序付けられたシーケンスの各要素と比較し、適切なに挿入します。順序付けられていないシーケンスが挿入されます。
例:
データの挿入と並べ替え[1、4、2、6、7、3、5、10、9]。
配列シーケンスの最初の要素1を順序付きシーケンスとすると、順序付きシーケンス[1]が取得され、配列は[1、4、2、6、7、3、5、10、9]になります。
-
最初の並べ替え:配列の2番目の要素4を取り出し、順序付けられたシーケンスを挿入し、新しい順序付けられたシーケンス[1,4]を取得します。シーケンスは[1、4、2、6、7、3、5、10 、9]。
-
2番目の順序:配列の3番目の要素2を取り出し、順序付けられたシーケンスを挿入し、新しい順序付けられたシーケンス[1,2,4]を取得します。シーケンスは[1、2、4、6、7、3、5、 10、9]。
-
3回目の並べ替え:配列の4番目の要素6を取得し、それを順序付けられたシーケンスに挿入して、新しい順序付けられたシーケンス[1,2,4,6]を取得します。シーケンスは、[1、2、4、6、 7、3、5、10、9]。
-
4番目の並べ替え:配列7の5番目の要素を取り出し、それを順序付けられたシーケンスに挿入し、新しい順序付けられたシーケンス[1,2,4,6,7]を取得します。シーケンスは、[1、2、4、6 、7、3、5、10、9]。
-
5番目の並べ替え:配列の6番目の原色3を取り出し、それを順序付けられたシーケンスに挿入し、新しい順序付けられたシーケンス[1,2,3,4,6,7]を取得します。シーケンスは、[1、2、 3、4、6、7、5、10、9]。
-
6番目の並べ替え:配列の7番目の要素5を取り出し、順序付けられたシーケンスに挿入して、新しい順序付けられたシーケンス[1,2,3,4,5,6,7]を取得します。シーケンスは、[1、 2、3、4、5、6、7、10、9]。
-
7番目の並べ替え:配列の8番目の要素10を取得し、それを順序付けられたシーケンスに挿入して、新しい順序付けられたシーケンス[1,2,3,4,5,6,7,10]を取得します。シーケンスは、[1、 2、3、4、5、6、7、10、9]。
-
8番目の並べ替え:配列の9番目の要素9を取り出し、それを順序付けられたシーケンスに挿入し、新しい順序付けられたシーケンス[1,2,3,4,5,6,7,9,10]を取得します。シーケンスは、 [1、2、3、4、5、6、7、9、10]
3、挿入ソートの特徴
-
時間計算量
ソートする配列を並べ替える場合が最適です。現在の数値と前の数値を比較するだけで、合計N-1回の比較が必要になり、時間計算量はO(n)になります。
最悪の場合、ソートされる配列の順序が逆になります。現時点では、比較の数が最も多く、合計回数は1 + 2 + 3 + 4 + ... + N-として記録されます。 1.現時点では、最悪の場合の挿入ソートの時間計算量はO(n2)です。 -
スペースの複雑さ
挿入ソートのスペースの複雑さは定数次数O(1)
4、C ++ソースコードの実装
実現プロセスでは、2層ループ、つまり1つの要素を除くすべての要素の外側のループを使用し、内側のループは、現在の要素の前に順序付きリストに挿入される位置を検索して移動します。
void StraightSort(int arr[], int len)
{
int i,j,temp;
for (i = 1; i < len; i++)
{
//数组往右逐个获取数据作为待插入到有序数组的值
temp = arr[i];
//比较待插入值和有序数组的值,找到插入数值在有序数组中的位置
for (j=i-1; 0 <=j && temp < arr[j]; j--)
{
arr[j+1]=arr[j];
}
arr[j+1]=temp;
}
}