排序(sorting)是按關鍵字的非遞減或非遞增順序對一組記錄重新排列的操作。確切描述如下:
假設含n個記錄的序列為,其相應的關鍵字序列為,需確定1,2,……,n的一種排列p1,p2,……pn,使其相應的關鍵字滿足如下的非遞減(或非遞增)關係。k p1≤k p2≤……≤k pn即使的序列成為乙個按關鍵字有序的序列,這樣的一種操作就稱為排序
當排序記錄中的關鍵字ki(i=1,2,……,n)都不相同時,則任何乙個記錄的無序序列經排序後得到的結果唯一;反之,當待排序的序列中存在兩個或兩個以上關鍵字相等的記錄時,則排序所得的結果不唯一。假設ki=kj(1≤i≤n,1≤j≤n,i≠j ),且在排序前的序列中ri領先於rj(即ii仍領先於rj,則稱所用的排序方法是穩定的;反之,若可能使排序後的序列中rj領先於ri則稱所用的排序方法是不穩定的。注意,排序演算法的穩定性是針對所有記錄而言的,也就是說,在所有的待排序記錄中,只要有一組關鍵字的例項不滿足穩定性要求,則該排序方法就是不穩定的。雖然穩定的排序方法和不穩定的排序方法排序結果不同,但不能說不穩定的排序方法就不好,各有各的適用場合
由於待排序記錄的數量不同,使得排序過程中資料所占用的儲存裝置會有所不同。根據在排序過程中記錄所占用的儲存裝置,可將排序方法分為兩大類,一類是內部排序,指的是待排序記錄全部存放在計算機記憶體中進行排序的過程;另一類是外部排序,指的是待排序記錄的數量很大,以致記憶體一次不能容納全部記錄,在排序過程中尚需對外存進行訪問的排序過程。
內部排序方法很多,但就其全面效能而言,很難提出一種被認為是最好的方法,每一種方法都有各自的優缺點,適合在不同的環境下使用
內部排序的過程是乙個逐步擴大記錄的有序序列長度的過程。在排序的過程中,可以將排序記錄區分為兩個區域:有序序列區和無序序列區
使有序區中記錄的數目增加乙個或幾個的操作稱為一趟排序。
根據逐步擴大記錄有序序列長度的原則不同,可以將內部排序分為以下幾類
(1)插入類:將無序子串行中的乙個或幾個記錄「插入」到有序序列中,從而增加記錄的有序子串行的長度。主要包括直接插入排序。折半插入排序和希爾排序。
(2)交換類:通過「交換」無序序列中的記錄從而得到其中關鍵字最小或最大的記錄,並將它加入到有序子串行中,以此方法增加記錄的有序子串行的長度。主要包括氣泡排序和快速排序
(3)選擇類:從記錄的無序子串行中「選擇」關鍵字最小或最大的記錄,並將它們加入到有序子串行中,以此方法增加記錄的有序子串行的長度。主要包括加單選擇排序、樹形選擇排序和堆排序。
(4)歸併類:通過「歸併」兩個或兩個以上的記錄有序子串行,逐步增加記錄有序序列的長度。2-路歸併排序是最為常見的歸併排序方法。
(5)分配類:是唯一一類不需要進行關鍵字之間比較的排序方法,排序時主要利用分配和收集兩種基本操作來完成。基數排序時主要的分配類排序方法
待排序記錄的儲存方式
(1)順序表:記錄之間的次序關係有其儲存位置決定,實現排序需要移動記錄。
(2)鍊錶:記錄之間的次序關係由指標指示,實現排序不需要移動記錄,僅需修改指標即可。這種排序方式稱為鍊錶排序。
(3)待排序記錄本儲存在一組位址連續的儲存單元內,同時另設乙個指示各個記錄儲存位置的位址向量,在排序過程中不移動記錄本身,而移動位址向量中這些記錄的「位址」,在排序結束之後再按照位址向量中的值調整記錄的儲存位置。這種排序方式稱為位址排序。
前面已經說過,就排序方法的全面效能而言,很難提出一種被認為是最好的方法。目前,評價排序演算法好壞的標準主要有兩點。
(1)執行時間
對於排序操作,時間主要消耗在關鍵字之間的比較和記錄的移動上(這裡,只考慮以順序表方式儲存待排序記錄),排序演算法的時間複雜度由這兩個指標決定。因此可以認為,高效的排序演算法的比較次數和移動次數都應該盡可能的少。
(2)輔助空間
空間複雜度由排序演算法所需的輔助空間決定。輔助空間是除了存放待排序記錄占用的空間之外,執行演算法所需要的其他儲存空間。理想的空間複雜度為o(1),即演算法執行期間所需要的輔助空間與待排序資料量無關。
數學概念與方法
學習目標 熟練掌握擴充套件歐幾里德演算法和它的時間複雜度 數量掌握用篩法構造素數表,了解素數定理 學會求二元線性不定方程的整數解 熟練掌握模運算規則,快速冪取模演算法和模線性方程的解法 熟悉楊輝三角 二項式定理和組合數的基本性質 學會推導約數個數公式和尤拉函式公式 熟練掌握可重集全排列的編碼和解碼演...
特徵工程的相關概念與方法
很多機器學習問題需要研究的物件時文字甚至影象,提取變數特徵的方法是資料處理的前提。bow和vsm bow bags of words model,忽略文件內的單詞順序和語法等要素,將其僅僅看作是若干的詞彙的集合。vsm vector space model,表示文字文件的數學模型,在bow的假設下,...
方法過載與方法重寫的概念和區別
方法過載 乙個類中有乙個方法a,你又在這個類中建立了乙個方法b,方法b的名字和a一樣,返回值型別也一樣,但是引數的型別或個數不同,此時b過載了a。例如 public class testclass public int test float f 方法重寫 乙個類m繼承另乙個類n,n中有乙個方法a,這...