ソートアルゴリズム - 挿入ソート

直接挿入ソート

 基本的な考え方

トリップ直接挿入ソート:Rはで順序付けられた領域に挿入されているプロセス[i]があります。

 

アルゴリズムコード

1  // 直接挿入ソート
2  空隙 InsertSort(INT * ARR、INT N-)
 3。 {
 4。     INT I、J;
 5      int型のTEMP;
 6  
。7      ための(I = 1に、Iは、N <; Iは++ 8      {
 9。         IF(ARR [ I <ARR [I - 1。 ])// i番目と逆の順序でソートされた先行の最後の要素は、移動開始した場合に
10          {
 11。              TEMP = ARR [I]; //は要素覚え
12である             ため(J = I - 1。 ; J> = 0ARR && [J]> TEMP; Jは、13は             {
 14                  ARR [J + 1 ] = ARR [J]; // 要素の単一温度よりも大きい後進
15              }
 16              ARR [J + 1 ] = TEMP ; // 条件まで、温度に置か満足j--、ない1 + J。
17          }
 18である     }
 19 }

アルゴリズム分析

バイナリ・挿入ソート

 基本的な考え方

 直接挿入ソート、地域あまりにも多くの要素を命じ、挿入位置を見つけるために、あまりにもバイナリ挿入方法の使用比較領域の数であることが、検索効率をスピードアップするための位置に挿入するバイナリ検索ですが、移動することもできます要素は、単に検索効率を向上させるために、まだ同じと直接挿入ソートされています。

 

アルゴリズムコード

 1 //折半插入排序
 2 void BinInsertSort(int *arr, int n)
 3 {
 4     int i, j;
 5     int low, high, mid;
 6     int temp;
 7     for (i = 1; i < n; i++)
 8     {
 9         if (arr[i] < arr[i - 1]) //如果第i个和前面的已排序的最后一个元素反序时,才开始查找
10         {
11             temp = arr[i]; //将要插入的元素被temp记住
12             low = 0;
13             high = i - 1;
14 
15             while (low <= high)
16             {
17                 mid = (low + high) / 2;
18                 if (temp < arr[mid])
19                     high = mid - 1;
20                 else
21                     low = mid + 1;
22             } //找到位置high
23 
24             for (j = i - 1; j >= high + 1; j--) //将比temp大的元素统一向后移动
25             {
26                 arr[j + 1] = arr[j];
27             }
28             arr[high + 1] = temp; //在high+1处放入temp
29         }
30     }
31 }

 算法分析

折半插入排序:在R[0..i-1]中查找插入R[i]位置,折半查找的平均关键字比较次数为log2(i+1)-1,平均移动元素的次数为i/2+2,所以平均时间复杂度为:

 

折半插入排序采用折半查找,查找效率提高。但元素移动次数不变,仅仅将分散移动改为集合移动。

 

おすすめ

転載: www.cnblogs.com/WindSun/p/11360523.html