1. 程式人生 > >基礎演算法【3】:插入排序InsertionSort

基礎演算法【3】:插入排序InsertionSort

  1. 插入排序:

    1. 插入排序類似於大多數人安排撲克牌的方式:

      1. 從你手中的一張牌開始,

      2. 選擇下一張卡並將其插入到正確的排序順序中,

      3. 對所有的卡重複上一步。

  2. 分析:

    1. 外迴圈執行N-1次,這很明顯。

    2. 但內迴圈執行的次數取決於輸入:

      1. 在最壞的情況下,陣列被反向排序並且(a [j]> X)始終為真插入始終發生在陣列的前端,並且內部迴圈以O(N)執行。

      2. 在最好的情況下,陣列已經排序並且(a [j]> X)總是為假所以不需要移位資料,並且內部迴圈執行在O(1),

      3. 因此,最佳情況時間是O(N × 1) = O(N) ,最壞情況時間是O(N × N) = O(N2).

  3. 程式碼:

void InsertionSort(int *arr, int num)
{
         int ret = 0;      
         int sorted, unsort;
         int to_insert;
                           
         for (unsort = 1; unsort < num; unsort++) { 
                 to_insert = arr[unsort];       
 
                 printf("-----------%02d---------\n", unsort);
                 for (sorted = unsort - 1; sorted >= 0 && arr[sorted] > to_insert; sorted--) {
                         printf("[index:%2d<-%2d] data:%2d<-%2d\n", 
                                         sorted+1, sorted, arr[sorted+1], arr[sorted]);
                         arr[sorted + 1] = arr[sorted]; 
                 }
 
                 printf("[index:%2d<-%2d] data:%2d<-%2d\n", 
                                 sorted+1, unsort, arr[sorted+1], to_insert);
                 arr[sorted + 1] = to_insert;   
 
         }
         return;
 }