【軟考】【數據結構與算法】排序

1.概念

  穩定與不穩定排序:21 , 32 , 13 , 45 , 21 。黑色21與紅色21的鍵值相同,排序完成後,黑色21仍然在紅色21之前,則該排序爲穩定排序,紅色21有可能在黑色21之前,則該排序爲不穩定排序。比如一次考試中出現了相同的分數,但這些分數是不同的人的成績,則應該用穩定排序會更好。
  內排序與外排序:內排序是在內存中進行的排序,外排序是在外部存儲中進行的排序
  排序的方法分類

  • 插入類排序:直接插入排序、希爾排序
  • 交換類排序:冒泡排序、快速排序
  • 選擇類排序:簡單選擇排序、堆排序
  • 歸併排序
  • 基數排序

     排序算法的性能
    這裏寫圖片描述

2.插入排序

  直接插入排序:優點簡單明瞭,缺點速度很慢。
這裏寫圖片描述
  希爾排序:實質是一種分組進行直接插入排序法。效率比直接插入排序高。
這裏寫圖片描述
  例如有10個數需要排序,第一次取d1 = 5 ,即每隔5個數分爲1組。先對每組進行組內直接插入排序。第二次取d2 = d1/2,如果帶小數則取接近小數的奇數,再進行組內直接插入排序,直至dt = 1 ,進行最後一次直接插入排序。

3.選擇排序

  直接選擇排序:每次選擇最小的數依次與第一個、第二個……數交換。
這裏寫圖片描述
  堆排序:先建立堆,依次取走堆頂的元素,再將剩餘的元素重新組成新的堆,再取走堆頂元素,直至排序完成。
這裏寫圖片描述
  形狀類似於完全二叉樹,其定義轉換爲二叉樹樹的說法爲: 所有的孩子結點都比自身大,則爲小頂堆;所有的孩子結點都比自身小,則爲大頂堆。
  初建堆
  數組 A = {1,3,4,5,7,2,6,8,0} ,其初建堆的過程如下:
這裏寫圖片描述
  按照完全二叉樹的規則,順次填入數組中的元素,從最後一個非葉子結點開始調整。如果建立大頂堆,則判斷非葉子結點是否大於其孩子結點;如果建立小頂堆,則判斷非葉子結點是否小於其孩子結點。並根據大頂堆還是小頂堆調整非葉子結點的位置。
  若我們對A進行初建大頂堆:
  圖1.1:從最後一個非葉子結點5開始調整,5小於其孩子結點8,則交換5跟8的位置
  圖1.2:倒數第二個非葉子結點爲4 ,4小於其孩子結點6,交換4跟6的位置
  圖1.3:下一個非葉子結點爲3,需要進行多級調整,首先3小於其孩子結點8和7,可以任選一個進行交換,我們選擇3和8進行交換,此時還需再對3,5,0的小數進行再次調整(圖1.4)
  圖1.5:調整完所有的非葉子結點後開始調整根節點,也需要進行多級調整。如圖1.6,圖1.7。調整後完成初建堆的過程。
  重組堆:將堆頂元素取走後如何重新組建新的堆
  例題,R{80,60,16,50,45,10,15,30,40,20}
這裏寫圖片描述
  將堆頂元素80取走後,選擇最後的結點20,放在堆頂,再對根節點進行初建堆的過程,即對根節點20進行多級調整。多級調整過程:20小於其孩子結點60,交換20與60的位置,20小於其孩子結點45與50,交換20與45的位置或交換20與50的位置(會得到不同的堆,但對最後結果沒有影響),圖中是交換20與50的位置,20小於其孩子結點30與40的位置,交換20與30的位置或交換20與40的位置。完成對堆的重組。

4.交換排序

  冒泡排序
  基本思想是:通過相鄰元素之間的比較和交換,將較小的元素逐漸從底部移向頂部。排序過程中應注意下標的變化。
這裏寫圖片描述

5.快速排序

  快速排序採用分治法,其基本思想是將原問題分解成若干個規模更小但結構域原問題相似的子問題,通過遞歸地解決這些子問題,然後再將這些子問題的解組合成原問題的解。步驟如下:
  第一步:待排序的n個記錄中任取一個記錄,以該記錄爲基準,將所有記錄分爲兩組,第一組都小於基準,第二組都大於基準。
  第二部:採用相同的方法對左右兩組進行排序,直到所有記錄完成排序。
這裏寫圖片描述

6.歸併排序

  歸併也稱爲合併,其基本思想是將兩個或兩個以上的有序子表合併成一個新的有序表。若將兩個有序表合併成一個有序表,則稱爲二路合併。
  合併的過程是:比較A[i]和A[j]的排序碼大小,若A[i]的排序碼小於等於A[j]的排序碼,則將第一個有序表中的A[i]複製到R[k]中, 並令i和k分別自加一。如此循環進行,直至其中一個有序表比較和複製完,然後再講另一個有序表的剩餘元素複製到R中。
這裏寫圖片描述

7.基數排序

  基本思想是藉助多關鍵字排序思想對單邏輯關鍵字進行排序的方法。基數的選擇和關鍵字分解是根據關鍵字的類型來決定的。例如關鍵字是十進制數,則可以按個位、十位進行分解。先排個位,再排十位,最後排百位,如下圖所示。
這裏寫圖片描述