1. 程式人生 > >數據結構(四十四)插入排序(1.直接插入排序 2.希爾排序)

數據結構(四十四)插入排序(1.直接插入排序 2.希爾排序)

結束 縮小 移動 個數 數據 空間 分析 過程 只有一個

  一、插入排序的基本思想

  從初始有序的子集合開始,不斷地把新的數據元素插入到已排列有序子集合的合適位置上,使子集合中數據元素的個數不斷增多,當子集合等於集合時,插入排序算法結束。常用的 插入排序算法有直接插入排序和希爾排序兩種。

  

  二、直接插入排序

  1.直接插入排序的定義

  直接插入排序的基本思想是:順序地把待排序的數據元素按其值的大小插入到已排序數據元素子集合的適當位置。子集合的數據元素個數從只有一個數據元素開始逐次增大。當子集合大小最終和集合大小相同時排序完畢。

  2.直接插入排序的實現

    public static void straightInsertionSort(int
[] L) { int i, j, temp; for (i = 0; i < L.length - 1; i++) { temp = L[i+1]; // 保存要插入的數據元素 j = i; while (j > -1 && temp <= L[j]) { // 將temp插入到原數組集合中 L[j+1] = L[j]; j
--; } L[j+1] = temp; } }

  int[] array1 = {9,1,5,8,3,7,4,6,2};
  初始時,子集合中L0已經排好序,即為{9}
  i=0時,temp=L1=1,j=0,0大於-1且1小於9,則L1=9,j=-1,L0=1,即將1插入到9的前面,集合中{1,9}
  i=1時,temp=L2=5,j=1,1大於-1且5小於9,則L2=9,j=0,0大於-1但5不小於1,則L1=5,集合中{1,5,9}
  i=2時,temp=L3=8,即將8和9比較,8插入到9的前面,8和5比較,不動,8和1比較,也不動,集合中{1,5,8,9}
  ...

  3.直接插入排序的性能分析

  (1)時間復雜度為O(n2)

  • 最好情況是原始數據集合已經全部排好序。這時內層while循環的循環次數每次均為0,外層for循環中每次數據元素的比較次數均為1,數據元素的賦值語句執行次數均為2。因此整個排序過程中比較次數為n-1,移動次數為2(n-1),此時的時間復雜度為O(n)。
  • 最壞情況是與原始數據集合反序排列。這時內層while循環的循環次數每次均為i,這樣,整個外層for循環中的比較次數為(1+1)+(2+1)+...+(n-1+1)=(n-1)(n+2)/2,而移動次數為(1+2)+(2+2)+...+(n-1+2)=(n-1)(n+4)/2。此時的時間復雜度為O(n2)。  
  • 隨機情況是數據集合中大小的排列是隨機的。這時比較次數的期望和移動次數的期望均為n2/4,此時的時間復雜度為O(n2)。

  (2)空間復雜度為O(1)。

  (3)是一種穩定的排序算法。

  三、希爾排序

  1.希爾排序的定義

  希爾排序的基本思想是:把待排序的數據元素分成若幹個小組,對同一小組內的數據元素用直接插入法排序;小組的個數逐次縮小;當完成了所有數據元素都在一個組內的排序後排序過程結束。希爾排序又稱作縮小增量排序。

  在直接插入排序算法的性能分析中可以得出結論:原始數據集合越接近有序,直接插入排序算法的時間效率越高,其時間效率在O(n)~O(n2)之間。這個結論是希爾排序算法能夠成立的基礎。希爾排序算法把待排序數據元素分成若幹小組,在小組內用直接插入排序算法排序,當把若幹個小組合並為一個小組時,組中的數據元素集合將會接近有序,這樣各組內的直接插入排序算法的時間效率就很好,最終整個希爾排序的時間效率就很高。

  

數據結構(四十四)插入排序(1.直接插入排序 2.希爾排序)