假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,ri=rj,且ri在rj之前,而在排序後的序列中,ri仍在rj之前,則稱這種排序演算法是穩定的;否則稱為不穩定的。
排序演算法如果是穩定的,那麼從乙個鍵上排序,然後再從另乙個鍵上排序,第乙個鍵排序的結果可以為第二個鍵排序所用。還有就是節省時間。
堆排序、快速排序、希爾排序、直接選擇排序不是穩定的排序演算法,而基數排序、氣泡排序、直接插入排序、折半插入排序、歸併排序是穩定的排序演算法。
根據排序過程中涉及的儲存器不同,可以講排序方法分為兩大類:一類是內部排序,指的是待排序的機率存放在記憶體中進行的排序過程;另一類的外部排序,指的是排序中要對外儲存器進行訪問的排序過程。
我們一般提到排序都是指內排序,比如快速排序,堆排序,歸併排序等,所謂內排序就是可以在記憶體中完成的排序。ram的訪問速度大約是磁碟的25萬倍,我們當然希望如果可以的話都是內排來完成。但對於大資料集來說,記憶體是遠遠不夠的,這時候就涉及到外排序的知識了。
外部排序指的是大檔案的排序,即待排序的記錄儲存在外儲存器上,待排序的檔案無法一次裝入記憶體,需要在記憶體和外部儲存器之間進行多次資料交換,以達到排序整個檔案的目的。
外部排序最常用的演算法是多路歸併排序,即將原檔案分解成多個能夠一次性裝人記憶體的部分,分別把每一部分調入記憶體完成排序。然後,對已經排序的子檔案進行歸併排序。
一般來說外排序分為兩個步驟:預處理和合併排序。即首先根據記憶體的大小,將有n個記錄的磁碟檔案分批讀入記憶體,採用有效的記憶體排序方法進行排序,將其預處理為若干個有序的子檔案,這些有序子檔案就是初始順串,然後採用合併的方法將這些初始順串逐趟合併成乙個有序檔案。
[外排序適用範圍]
大資料的排序,去重基本原理及要點:外排序的歸併方法,置換選擇,敗者樹原理,最優歸併樹擴充套件。
問題例項:1).有乙個1g大小的乙個檔案,裡面每一行是乙個詞,詞的大小不超過16個位元組,記憶體限制大小是1m。返回頻數最高的100個詞。這個資料具有很明顯的特點,詞的大小為16個位元組,但是記憶體只有1m做hash有些不夠,所以可以用來排序。記憶體可以當輸入緩衝區使用。
一般將基於比較進行的排序稱為比較排序。
主要存在插入排序、堆排序、增量排序(shell排序)、歸併排序、快速排序,每一種排序演算法都有自己的優缺點,比如插入法排序適用於那些長度短的排序,對於長的表,有些愛莫能助啊,堆排序主要是依據了二叉堆的特性,但是建立堆的過程也是乙個複雜的問題,增量排序的過程是乙個不斷精確的過程,但是目前也只是乙個經驗方式。歸併排序是乙個遞迴的問題,採用分治的思想實現,但是這種演算法需要額外的儲存空間,快速排序雖然是實踐中比較常用的演算法,但是對於有序的陣列採用快速排序就是災難。比較型演算法的時間複雜度最優也只能到達o(nlogn)。
而非基於比較的排序,如計數排序,桶排序,和在此基礎上的基數排序,則可以突破o(nlogn)時間下限。但要注意的是,非基於比較的排序演算法的使用都是有條件限制的,例如元素的大小限制,相反,基於比較的排序則沒有這種限制(在一定範圍內)。但並非因為有條件限制就會使非基於比較的排序演算法變得無用,對於特定場合有著特殊的性質資料,非基於比較的排序演算法則能夠非常巧妙地解決。
一些排序方法
從網上找了一些排序方法,可能以後用的著,自己先編寫一下,然後存下來 1.冒泡法 思想 1.從a 0 到a n 相鄰的兩個數進行比較,如果滿足條件則交換,如此反覆。2.這種演算法要經過n 1輪的大迴圈。以下是維基百科思想 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同樣的工...
複習總結 一些簡單的排序演算法
1.氣泡排序,氣泡排序屬於簡單排序的一種,也是大多數人學會的第乙個排序演算法,其基本思想是,從左到右掃瞄每個資料,跟它相鄰的比較,如果大小順序不對,就交換兩個資料的位置,這種演算法的最壞時間複雜度為n 2,屬於穩定排序的一種,然而,氣泡排序由於時間複雜度比較高,所以往往並不是最優演算法,然而,它有乙...
一些重要的排序演算法
void pigeonholesort byte array,intlength int i,k,j 0 for i 0 i length i b array i for i 0 i 256 i for k 0 k b i k array j i 多一次遍歷的計數排序,排序位元組串的話速度約是鴿巢排...