排序(sort)

一、定義

排序

    所謂排序,就是要整理文件中的記錄,使之按關鍵字遞增(或遞減)次序排列起來。其確切定義以下:算法

    輸入:n個記錄R1,R2,…,Rn,其相應的關鍵字分別爲K1,K2,…,Kn。數組

    輸出:Ril,Ri2,…,Rin,使得Ki1≤Ki2≤…≤Kin,或Ki1≥Ki2≥…≥Kin。函數

記錄

    被排序的對象--文件由一組記錄組成。性能

    記錄則由若干個數據項(或域)組成。其中有一項可用來標識一個記錄,稱爲關鍵字項。該數據項的值稱爲關鍵字(Key)spa

注意:指針

    在不易產生混淆時,將關鍵字項簡稱爲關鍵字code

關鍵字

    用來做排序運算依據的關鍵字,能夠是數字類型,也能夠是字符類型。orm

    關鍵字的選取應根據問題的要求而定。對象

    【例】在高考成績統計中將每一個考生做爲一個記錄。每條記錄包含准考證號、姓名、各科的分數和總分數等項內容。若要唯一地標識一個考生的記錄,則必須用"准考證號"做爲關鍵字。若要按照考生的總分數排名次,則需用"總分數"做爲關鍵字。排序

二、排序的穩定性

    當待排序記錄的關鍵字均不相同時,排序結果是唯一的,不然排序結果不惟一。

    在待排序的文件中,若存在多個關鍵字相同的記錄,通過排序後這些具備相同關鍵字的記錄之間的相對次序保持不變,該排序方法是穩定的;若具備相同關鍵字的記錄之間的相對次序發生變化,則稱這種排序方法是不穩定的。

    注意:

    排序算法的穩定性是針對全部輸入實例而言的。即在全部可能的輸入實例中,只要有一個實例使得算法不知足穩定性要求,則該排序算法就是不穩定的

三、分類

    (1)按是否涉及數據的內、外存交換分

    在排序過程當中,若整個文件都是放在內存中處理,排序時不涉及數據的內、外存交換,則稱之爲內部排序(簡稱內排序);反之,若排序過程當中要進行數據的內、外存交換,則稱之爲外部排序

    注意:

    ① 內排序適用於記錄個數不不少的小文件;

    ② 外排序則適用於記錄個數太多,不能一次將其所有記錄放人內存的大文件。

    (2)按策略劃份內部排序方法

    能夠分爲五類:插入排序(直接插入排序希爾排序)、選擇排序(直接選擇排序堆排序)、交換排序(冒泡排序快速排序)、歸併排序和分配排序(箱排序、基數排序)。

四、順序存儲結構

#define MAXSIZE 10    /*用於要排序數組個數最大值,可根據須要修改*/

typedef struct
{
    int data[MAXSIZE+1];    /*用於存儲要排序的數組,data[0]用做哨兵或臨時變量*/
    int length;            /*用於記錄順序表的長度*/
}SqList;

或者以下定義存儲結構:

#define n l00         //假設的文件長度,即待排序的記錄數目
typedef int KeyType; //假設的關鍵字類型
  
typedef struct      //記錄類型
{ 
    KeyType key;       //關鍵字項
    InfoType otherinfo;//其它數據項,類型InfoType依賴於具體應用而定義,這裏能夠是數據長度length
}RecType;

typedef RecType SeqList[n+1];//SeqList爲順序表類型,表中第0個單元通常用做哨兵

    注意:

    若關鍵字類型沒有比較算符,則可事先定義宏或函數來表示比較運算。

    【例】關鍵字爲字符串時,可定義宏"#define LT(a,b)(Stromp((a),(b))<0)"。那麼算法中"a<b"可用"LT(a,b)"取代。若使用C++,則定義重載的算符"<"更爲方便。

五、算法分析

    (1)排序算法的基本操做

     大多數排序算法都有兩個基本的操做:

  a、比較兩個關鍵字的大小;

  b、改變指向記錄的指針或移動記錄自己。

  注意:

     第b種基本操做的實現依賴於待排序記錄的存儲方式。

    (2)待排文件的經常使用存儲方式

    a、以順序表(或直接用向量)做爲存儲結構

    排序過程:對記錄自己進行物理重排(即經過關鍵字之間的比較斷定,將記錄移到合適的位置)

    b、以鏈表做爲存儲結構

  排序過程:無須移動記錄,僅需修改指針。一般將這類排序稱爲鏈表(或鏈式)排序;

    c、用順序的方式存儲待排序的記錄,但同時創建一個輔助表(如包括關鍵字和指向記錄位置的指針組成的索引表)

    排序過程:只需對輔助表的表目進行物理重排(即只移動輔助表的表目,而不移動記錄自己)。適用於難於在鏈表上實現,仍需避免排序過程當中移動記錄的排序方法。

    (3)排序算法性能評價

    a、評價排序算法好壞的標準

    評價排序算法好壞的標準主要有兩條:

    ① 執行時間和所需的輔助空間;

    ② 算法自己的複雜程度。

    b、排序算法的空間複雜度

    若排序算法所需的輔助空間並不依賴於問題的規模n,即輔助空間是O(1),則稱之爲就地排序(In-PlaceSou)。

    非就地排序通常要求的輔助空間爲O(n)

    c、排序算法的時間開銷

    大多數排序算法的時間開銷主要是關鍵字之間的比較和記錄的移動。有的排序算法其執行時間不只依賴於問題的規模,還取決於輸入實例中數據的狀態。

相關文章
相關標籤/搜索