《大話資料結構》第9章 排序 9.2 排序的基本概念與分類_大話資料結構

來源:互聯網
上載者:User
9.2 排序的基本概念與分類

9.2.1 排序的定義
        排序是我們生活中經常會面對的問題。同學們做操時會按照從矮到高排列;老師查看上課出勤情況時,會按學生學號順序點名;高考錄取時,會按成績總分降序依次錄取等。那排序的嚴格定義是什麼呢。
        假設含有n個記錄的序列為{r1,r2,……,rn},其相應的關鍵字分別為{k1,k2,……,kn},需確定1,2,……,n的一種排列p1,p2,……,pn,使其相應的關鍵字滿足kp1≤kp2≤……≤kpn(非遞減或非遞增)關係,即使得序列成為一個按關鍵字有序的序列{rp1,rp2,……,rpn},這樣的操作就稱為排序。
        注意我們在排序問題中,通常將資料元素稱為記錄。顯然我們輸入的是一個記錄集合,輸出的也是一個記錄集合,所以說,可以將排序看成是線性表的一種操作。
        排序的依據是關鍵字之間的大小關係,那麼,對同一個記錄集合,針對不同的關鍵字進行排序,可以得到不同序列。
        這裡關鍵字ki可以是記錄r的主關鍵字,也可以是次關鍵字,甚至是若干資料項目的組合。比如我們某些大學為了選拔在主科上更優秀的學生,要求對所有學生的所有科目總分降序排名,並且在同樣總分的情況下將語數外總分做降序排名。這就是對總分和語數外總分兩個次關鍵字的的組合排序。如圖9-2-1,對於組合排序的問題,當然可以先排序總分,若總分相等的情況下,再排序語數外總分,但這是比較土的辦法。我們還可以應用一個技巧來實現一次排序即完成組合排序問題,例如把總分與語數外都當成字串首尾串連在一起(注意語數外總分如果位元不夠三位需要在前面補零),很容易可以得到令狐沖的“753229”要小於張無忌的“753236”,於是張無忌就排在了令狐沖的前面。         從這個例子也可看出,多個關鍵字的排序最終都可以轉化為單個關鍵字的排序,因此,我們這裡主要討論的是單個關鍵字的排序。

 

9.2.2 排序的穩定性
        也正是由於排序不僅是針對主關鍵字,那麼對於次關鍵字,因為待排序的記錄序列中可能存在兩個或兩個以上的關鍵字相等的記錄,排序結果可能會存在不唯一的情況,我們給出了穩定與不穩定排序的定義。
        假設ki=kj(1≤i≤n,1≤j≤n,i≠j),且在排序前的序列中ri領先於rj(即i<j)。如果排序後ri仍領先於rj,則稱所用的排序方法是穩定的;反之,若可能使得排序後的序列中rj領先ri,則稱所用的排序方法是不穩定的。如圖9-2-2,經過對總分的降序排序後,總分高的排在前列。此時對於令狐沖和張無忌而言,未排序時是令狐沖在前,那麼它們總分排序後,分數相等的令狐沖依然應該在前,這樣才算是穩定的排序,如果他們二者顛倒了,則此排序是不穩定的了。只要有一組關鍵字執行個體發生類似情況,就可認為此排序方法是不穩定的。排序演算法是否穩定的,要通過分析後才能得出。

 


9.2.3 內排序與外排序
        根據在排序過程中待排序的記錄是否全部被放置在記憶體中,排序分為:內排序和外排序。
        內排序是在排序整個過程中,待排序的所有記錄全部被放置在記憶體中。外排序是由於排序的記錄個數太多,不能同時放置在記憶體,整個排序過程需要在內外存之間多次交換資料才能進行。我們這裡主要就介紹內排序的多種方法。
        對於內排序來說,排序演算法的效能主要是受三個方面影響
        1) 時間效能。排序是資料處理中經常執行的一種操作,往往屬於系統的核心部分,因此排序演算法的時間開銷是衡量其好壞的最重要的標誌。在內排序中,主要進行兩種操作:比較和移動。比較指關鍵字之間的比較,這是要做排序最起碼的操作。移動指記錄從一個位置移動到另一個位置,事實上,移動可以通過改為記錄的儲存方式來予以避免(這個我們在講解具體的演算法時再談)。總之,高效率的內排序演算法應該是具有儘可能少的關鍵字比較次數和儘可能少的記錄移動次數。
        2) 輔助空間。評價排序演算法的另一個主要標準是執行演算法所需要的輔助儲存空間。輔助儲存空間是除了存放待排序所佔用的儲存空間之外,執行演算法所需要的其他儲存空間。
        3) 演算法的複雜性。注意這裡指的是演算法本身的複雜度,而不是指演算法的時間複雜度。顯然演算法過於複雜也會影響排序的效能。
        根據排序過程中藉助的主要操作,我們把內排序分為:插入排序、交換排序、選擇排序和歸併排序。可以說,這些都是比較成熟的排序技術,已經被廣泛地應用於許許多多的程式語言或資料庫當中,甚至它們都已經封裝了關於排序演算法的實現代碼。因此,我們學習這些排序演算法的目的更多原因並不是為了去在現實中編程排序演算法,而是通過學習來提高我們編寫演算法的能力,以便於去解決更多複雜和靈活的應用性問題。
本章一共要講解七種排序的演算法,按照演算法的複雜度分為兩大類,冒泡排序、簡單選擇排序和直接插入排序屬於簡單演算法,而希爾排序、堆排序、歸併排序、快速排序屬於改進演算法。後面我們將依次講解。

9.2.4 排序用到的結構與函數
        為了講清楚排序演算法的代碼,我先提供一個用於排序用的順序表結構,此結構也將用於之後我們要講的所有排序演算法。

#define MAXSIZE 10    /* 用於要排序數組個數最大值,可根據需要修改 */typedef struct{ int r[MAXSIZE+1];  /* 用於儲存要排序數組,r[0]用作哨兵或臨時變數 */ int length;   /* 用於記錄順序表的長度 */}SqList;

        另外,由於排序最最常用到操作是數組兩元素的交換,我們將它寫成函數,在之後的講解中會大量的用到。

/* 交換L中數組r的下標為i和j的值 */void swap(SqList *L,int i,int j) {  int temp=L->r[i];  L->r[i]=L->r[j];  L->r[j]=temp; }


        好了,說了這麼多,我們來看第一個排序演算法。

出處:http://www.cnblogs.com/cj723/archive/2011/04/14/2016029.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.