ソートを直接挿入します
1ソートアイデア:
ソートされるレコードRIは、すでにソートされたレコードR1、R2、...、R(n-1)に挿入されます。
ランダムシーケンスの場合、2番目の要素から始まり、要素を順番に要素の対応する位置に挿入します。それがソートされる前の要素。
一次:2番目の要素を前の順序で順序リストに挿入します(この時点では、前の要素には1つの要素のみがあります。もちろん注文されます)。その後、このシーケンスの最初の2つの要素が順序付けられます。
2番目のソート:最初の2つの要素が順序付けられるように、前の長さ2の順序付けリストに3番目の要素を挿入します。
n番目の要素が前の長さ(n-1)の順序付けリストに挿入されるまで。
2アルゴリズムの実装:
// sort sort straight_insert_sort(int num []、int len){int i、j、key; for(j = 1; j <len; j ++){key = num [j]; i = j-1; while(i> = 0 && num [i]> key){num [i+1] = num [i];私 - ; } num [i+1] = key; }}3パフォーマンス分析:
3.1スペースの複雑さ:上記のように、補助ユニットキーが使用され、スペースの複雑さはO(1)です
3.2時間の複雑さ:
3.2.1ベストケース:ソートするレコードは既に注文されてから、1回の旅行で並べ替え、キーワードが1回比較され、レコードが2回移動されます。プロセス全体
比較の数はです
レコードの動きの数は次のとおりです
時間の複雑さo(n)
3.2.2最悪の場合:ソートされるレコードはすでに逆の順序であり、キーワードの比較時間はI(I-1から0から0)、レコードは(I+2)回数です。プロセス全体
比較の数はです
レコードの動きの数は次のとおりです
時間の複雑さo(n^2)
3.2.3平均時間の複雑さ:o(n^2)
3.3安定性:安定
ハーフインサートソートを折ります
1ソートアイデア:
直接ソートに基づいて、ソートされるレコードは、すでにソートされたレコードR1、R2、...、R(n-1)に挿入されます。 R1、R2、...、R(n-1)のレコードがソートされているため、挿入位置を探すときに「ハーフディンディング」を使用できます。
2アルゴリズムの実装:
// fold half insert sort void binary_insert_sort(int num []、int len){int i、j、key、low、high、mid; for(i = 1; i <len; i ++){key = num [i]; low = 0; high = i-1; mid =(low+high)/2; //挿入ポイントを見つけます。最終挿入ポイントは低くなります(low <= high){if(key <num [mid])high = mid-1;それ以外の場合は、low = mid+1; mid =(low+high)/2; } //(j = i; j> low; j - ){num [j] = num [j-1]; } // record num [low] = key;を挿入します。 }}3パフォーマンス分析:
3.1スペースの複雑さ:上記のように、補助ユニットキーが使用され、スペースの複雑さはO(1)です
3.2時間の複雑さ:ハーフフィニッシュの検索はレコードの数と比較の数を減らしますが、動きの数を減らすことはないため、時間の複雑さは直接検索アルゴリズムと同じです。
3.2.1ベストケース:時間の複雑さo(n)
3.2.2最悪の場合:時間の複雑さO(n^2)
3.2.3平均時間の複雑さ:o(n^2)
3.3安定性:安定