1. 程式人生 > >C++排序方法:插入排序、交換排序、選擇排序

C++排序方法:插入排序、交換排序、選擇排序

資料排序(sorting)是最重要的計算應用之一。例如查字典,字典中的詞條是按序存放的,我們才能按字母順序找到要查的字。又如圖書館的藏書也是按書的編號有序排列的。在計算機上資料庫裡的資料也是有序排列的。

排序的概念:

  • 排序(sorting)是資料處理中經常使用的一種重要運算,其功能是將資料元素的無序序列調整為有序序列。
  • 資料元素中一般有多個數據項,排序可選擇其中一個可排序的資料項(可進行比較運算)作為依據,稱為排序關鍵字
  • 關鍵字舉例:我們對高考考生的統計表進行排序,可根據考生的准考證號,這樣的關鍵字可以保證排序結果的唯一性,稱主關鍵字。但為了便於錄取,我們也可以按高考總分排序,只可稱關鍵字,這樣同一分數的人很多,這些人的排名可再取一個次關鍵字
    如數學或語文分來排序,以減少重複排名的隨意性。
  • 從小到大排序稱升序,反之為降序。

最常見的三類方法是插入排序選擇排序交換排序

插入排序(Insert Sorting)

◆ 1、直接插入排序的思想是(以升序為例):
當插入第i(i>=1)個元素sl[i]時,前面的元素:sl[0],sl[1],…,sl[i-1]已經排好序,我們將sl[i]的關鍵字與sl[i-1], sl[i-2],…,的關鍵碼順序進行比較,找到第一個比它小的,則sl[i]插到該元素之後。那麼怎麼保證前面的元素排好序呢?可以從第一號元素開始,前面只有第0號元素 ,這一個元素肯定是排好序的!參見下圖。


圖6.5 直接插入排序的過程(演示過程)

直接插入排序演算法中用了一個臨時變數temp,要插入的元素放到temp中,這樣插入前各元素後移時允許將該元素沖掉。具體演算法程式碼請參見

【例6.6】升序直接插入排序演算法。(檢視原始碼)

◆ 2、對半插入排序(Binary Insert Sort):是用對半查詢的思想取代順序查詢。
對半插入排序要快於插入排序,具體演算法程式碼請參見

【例6.7】升序對半插入排序演算法。(檢視原始碼)

交換排序

交換排序基本思想是:按關鍵字兩兩排序物件,如果發生逆序則交換之,直到所有的物件都排好序為止。這裡介紹氣泡排序(Bubble Sort)。

氣泡排序基本思想(參見圖6.6):最左列為最初的情況,最右列為完成後的情況。首先我們從一列資料底部開始,相鄰的兩資料進行比較,小的數放上面,一趟比較下來,最小的資料冒到了最上面。再縮小區域,按同樣方法繼續下一趟交換,如果有一趟比較中沒有發生交換,則已排好序。圖6.6中,第5列就已排好序,若再繼續下一趟就不會發生交換。(檢視動畫演示)


圖6.6 從下往上掃描的冒泡程式

【例6.8】氣泡排序演算法,作為Orderedlist<T,size>類的成員函式。(檢視原始碼)

選擇排序(Selection Sort)

選擇排序基本思想是:例如升序,每一趟從待排序的記錄中選出關鍵字最小的元素,放在已排好序的子序列的後面,直到全部記錄排序完成。

直接選擇排序(Straight Selection Sort)是最簡單的(參見圖6.7)。此方法的最大優點是非常易讀。缺點是做過的工作和序列的部分有序性利用不上,效率低。選擇排序中也有可能利用到以前的工作的方法,如堆排列(Heap Sort)。(檢視動畫演示)

【例6.9】直接選擇排序,作為Orderedlist<T,size>類的成員函式。(檢視原始碼)