1. 程式人生 > >資料結構----排序

資料結構----排序

一、排序的基本概念與分類 1、含有n個記錄的序列為r1到rn,其相應的關鍵字分別為k1到kn,需確定1到n的一種排列p1到pn,使其相應的關鍵字滿足kp1小於等於一直到kpn(非遞減或非遞增)關係,即使得序列稱為一個按關鍵字有序的序列rp1到rpn,這樣的操作就稱為排序

2、排序的穩定性: 假設ki=kj(i和j在1到n之間,且i不等於j),且在排序前的序列中ri領先於rj(即i<j)。如果排序後ri仍領先於rj,則稱所用的排序方法是穩定的;反之,若可能使得排序後的序列中rj領先ri,則稱所用的排序方法是不穩定的;

3、內排序與外排序 根據在排序過程中待排序的記錄是否全部被放置在記憶體中,排序分為:內排序和外排序; 內排序

是在排序整個過程中,待排序的所有記錄全部被放置在記憶體中; 外排序是由於排序的記錄個數太多,不能同時放置在記憶體,整個排序過程需要在內外存之間多次交換資料才能進行;

4、對於內排序來說,排序演算法的效能: 時間效能; 輔助空間; 演算法的複雜性;

5、根據排序過程中藉助的主要操作,把內排序分為:插入排序,交換排序,選擇排序和歸併排序

二、氣泡排序 1、氣泡排序是一種交換排序,它的基本思想是:兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄為止; 時間複雜度O(n^2);

三、簡單選擇排序 1、簡單選擇排序法就是通過n-i此關鍵字間的比較,從n-i+1個記錄中選出關鍵字最小的記錄,並和第i(i在1到n之間)個記錄交換之; 特點是交換移動資料次數相當少,時間複雜度O(n^2);

四、直接插入排序 1、直接插入排序的基本操作是將一個記錄插入到已經排好序的有序表中,從而得到一個新的、記錄數增1的有序表; 時間複雜度O(n^2);

五、希爾排序 1、所謂的基本有序,就是小的關鍵字基本在前面,大的基本在後面,不大不小的基本在中間;

2、跳躍分割:將相距某個“增量”的記錄組成一個子序列,這樣才能保證在子序列內分別進行直接插入排序後得到的結果是基本有序而不是區域性有序;

3、增量序列的最後一個增量值必須等於1才行;由於記錄是跳躍式的移動,希爾排序並不是一種穩定的排序演算法; 時間複雜度(O(n^(3/2)))

六、堆排序 1、堆是具有下列性質的完全二叉樹:每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆

;或者每個結點的值都小於或等於其左右孩子結點的值,稱為小頂堆

2、**堆排序(heap sort)**就是利用堆進行排序的方法。它的基本思想是,將待排序的序列構造成一個大頂堆(或小頂堆也可以)。此時,整個序列的最大值就是堆頂的根結點。將它移走(其實就是將其與堆陣列的末尾元素交換,此時末尾元素就是最大值),然後將剩餘的n-1個序列重新構造成一個堆,這樣就會得到n個元素中的次小值。如此反覆執行,便能得到一個有序序列了。 時間複雜度O(nlogn)不穩定排序法

七、歸併排序 1、歸併排序就是利用歸併的思想實現的排序演算法。它的原理是假設初始序列含有n個記錄,則可以看成是n個有序的子序列,每個子序列的長度為1,然後兩兩歸併,得到n/2向上取整個長度為2或1的有序子序列;再兩兩歸併,如此重複,直至得到一個長度為n的有序序列為止; 時間複雜度O(nlogn)遞迴的空間複雜度O(n+logn)穩定演算法 非遞迴的空間複雜度為O(n)

八、快速排序 1、快速排序的基本思想是:通過一趟排序將待排記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字小,則可分別對著兩部分記錄繼續進行排序,以達到整個序列有序的目的;

2、partition函式要做的,就是先選取當中的一個關鍵字,然後想盡辦法將它放到一個位置,使得它左邊的值都比它小,右邊的值比它大,這樣的關鍵字稱為樞軸(pivot)時間複雜度O(nlogn)空間複雜度O(logn)不穩定演算法

3、可以隨機獲得一個low與high之間的數rnd,稱為隨機選取樞軸法

4、三數取中法:即取三個關鍵字先進行排序,將中間數作為樞軸,一般是取左端、右端和中間三個數,也可以隨機選取;

5、九數取中法:先從陣列中分三次取樣,每次取三個數,三個樣品中各取出眾數,然後從這三個中數當中再取出一箇中數作為樞軸;

6、 排序分類

排序方法