插入類排序——直接插入排序

直接插入排序思想

直接插入排序思想過程可以理解爲現在你手裏有一沓錢,錢有5毛的,1塊的,5塊的,10塊的,20塊的,50塊的,100塊的。根據我的習慣,喜歡把錢按照紙幣面積大小放好,所以100的肯定在下面把其他面額的錢包起來放在口袋裏。但是現在我們手裏的一沓錢是亂序的,不按照紙張面積大小排放,所以我們現在要把這些錢排序放好。
第一張默認已經排好了。第二張錢的面值與第一張比較,如果大於第一張則位置不動,如果小於第一張則拿出來插入原本第一張錢的前面。第三張錢的面值與第二張比較如果小於則插入其前面,再與第一張比較如果小於則再次插入前面。第四張再次像前幾步那樣比較,第五張第六張第七張也是。需要注意的是每次比較都要到第一張錢,也就是說一張錢確定其位置的過程中可能有多次“插入”的過程。

直接插入排序代碼實現

#include<stdio.h>
void insertSort(int *R,int n);
int main(void){
 int arr[8]={49,38,65,97,76,13,27,40};
 int i;
 printf
 for(i = 0;i <8; i++)
    {
        printf("%d ",arr[i]);
    }
    printf("\n");
    insertSort(arr,8); 
 for(i = 0 ;i < 8; i++)
    {
        printf("%d ",arr[i]);
    }
    printf("\n");
} 
//插入排序函數
void insertSort(int *R,int n){
 int i,j;
 int temp;
 int r[n];
 for(i=1;i<n;++i)
 {
  temp=R[i];
  j=i-1;
  while(j>=0&&temp<R[j])
  {
   R[j+1]=R[j];
   --j; 
  }
  R[j+1]=temp;
 }
}

插入排序代碼解釋

原始序列:49 38 65 97 76 13 27 40
1)—開始只看第一個數49當然是有序的.
49 38 65 97 76 13 27 40
2)插入第二個數38。 38<49。所以49向後移動一個位置,38插入到49原來的位霣,這次排序後的結果爲:
38 49 65 97 76 13 27 40
3)插入65, 65>49,所以不而要移動,65就應該在49之後,這次排序後的結果爲:
38 49 65 97 76 13 27 40
4)插入97, 97>65,所以不需要移動,97就應該在65之後,這次排序後的結果爲:
38 49 65 97 76 13 27 40
5)插入76, 76<97,所以97向後移動一個位置:繼續比較,76>65, 65不需要移動,76應該插入
在65之後、97之前,這趙烊序後的結果爲:
38 49 65 76 97 13 27 40
6)插入13,13<97, 97後移:丨3<76, 76後移:這樣逐個向前比較,發現13應該插入在最前面,
這次排序後的結果爲:
13 38 49 65 76 97 27 40
7)插入27,還是從後向前進行比較,確定27應該插入在13之後、38之前,這次排序後的結果爲:
13 27 38 49 65 76 97 40
8)最後插入40,同樣從後向前逐個比較,直到38<40<49,它的位置確定,直接插入排序全過程完成。
最後的排序結果爲:
13 27 38 40 49 65 76 97

插入排序時間複雜度

  1. 我們首先看最壞的情況就是整個序列都是逆序的,則while循環中temp<R[j]條件始終成立。此時while循環中的循環次數達到最大值,可以循環i次,如:當i=7時while循環j值從0取到6,可以執行7次。而i的取值爲從1到n-1所以總共執行次數爲1+2+3+4+5+…+n-1=n*(n-1)/2所以此時時間複雜度爲O(n^2)
  2. 我們再來看最好的情況就是整個序列一直是有序的,那麼while循環中的temp<R[j]不成立,那麼就是單層for循環。所以時間複雜度爲O(n)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章