排序算法之直接插入排序

A,直接插入排序:排序過程中,整個序列被分成兩部分,前一部分有序,後一部分無序。每次從無序表中取出一個元素,然後把它插入到有序表中的合適位置,使有序表保持有序,直到無需表部分元素個數爲0,排序結束。
B,算法原理:
1)假設數組序列依次爲a1,a2,.....,an;
2)第一趟比較a1和a2,時前兩個元素升序排序,第二趟比較a1,a2,a3,使前三個元素升序排序;
3)每次新元素i插入到前i-1個已經有序的元素中時,依次與i-1,i-2,...,1位置的元素比較,並插入到對應次序位置;
4)以此類推,直到使前n個元素有序,排序結束。
下圖爲一組亂序序列直接插入排序的過程:
排序算法之直接插入排序

C,算法實現:
#include ”iostream”

usingnamespace std;

 

intmain()

{

        void sort(int[], int);

        int array[] = {5,3,11,7,1,8,12,14,9};

        int n = sizeof(array)/sizeof(int*);

        sort(array, n);

        for(int i = 0; i < n; ++i)

                  cout<<array[i]<<" ";

        cout<<endl;

        return 0;

}

//直接插入排序

//array表示測試元素序列,n爲序列元素個數

voidsort(int array[], int n)

{

        int temp,index;

        for(int i = 1; i < n; ++i)

        {

                  temp = array[i];

                  index = i;

                  //找到元素插入的位置

                  for(int j = i - 1; j >= 0; --j)

                  {

                           if(array[index] < array[j])

                                    index = j;

                           else break;

                  }

                  //將插入位置之後的元素後移一個位置

                  for(int k = i; k > index; --k)

                           array[k] = array[k-1];

                  array[index] = temp;

        }

}

運行結果:

排序算法之直接插入排序
D,複雜度分析
(a)時間複雜度:
   1)如果序列初始爲升序排序,則無需移動,只需比較n-1次即可完成排序,因此最好的時移動次數複雜度 
      爲O(n),移動次數複雜度爲O(1);
   2)如果序列初始爲降序排序,則最壞需要比較1+2+3+...+(n-1)=n(n-1)/2次,最壞需要移動1+2+...+      (n-1)=n(n-1)/2次,因此比較的最壞時間複雜度爲O(n^2),移動的最壞時間複雜度爲O(n^2);
   3)綜上所述,比較的平均時間複雜度爲O(n^2),移動的平均時間複雜度爲O(n^2)。
(b)空間複雜度:程序中定義了temp和index兩個變量,因此空間複雜度爲O(1)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章