排序有內部排序和外部排序,內部排序是資料記錄在記憶體中進行排序,而外部排序是因排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。我們這裡說說八大排序就是內部排序。
當n較大,則應採用時間複雜度為o(nlog2n)的排序方法:快速排序、堆排序或歸併排序序。面試中常見的是快速排序和歸併排序。快速排序:是目前基於比較的內部排序中被認為是最好的方法,當待排序的關鍵字是隨機分布時,快速排序的平均時間最短;
時間複雜度來說:(1)平方階(o(n2))排序時間複雜度函式o(n)的增長情況
各類簡單排序:直接插入、直接選擇和氣泡排序;
(2)線性對數階(o(nlog2n))排序
快速排序、堆排序和歸併排序;
(3)線性階(o(n))排序
基數排序,此外還有桶、箱排序。
說明:
當原表有序或基本有序時,直接插入排序和氣泡排序將大大減少比較次數和移動記錄的次數,時間複雜度可降至o(n);
而快速排序則相反,當原表基本有序時,將蛻化為氣泡排序,時間複雜度提高為o(n2);
原表是否有序,對簡單選擇排序、堆排序、歸併排序和基數排序的時間複雜度影響不大。
穩定性:
排序演算法的穩定性:若待排序的序列中,存在多個具有相同關鍵字的記錄,經過排序, 這些記錄的相對次序保持不變,則稱該演算法是穩定的;若經排序後,記錄的相對 次序發生了改變,則稱該演算法是不穩定的。
穩定性的好處:排序演算法如果是穩定的,那麼從乙個鍵上排序,然後再從另乙個鍵上排序,第乙個鍵排序的結果可以為第二個鍵排序所用。基數排序就是這樣,先按低位排序,逐次按高位排序,低位相同的元素其順序再高位也相同時是不會改變的。另外,如果排序演算法穩定,可以避免多餘的比較;
穩定的排序演算法:氣泡排序、插入排序、歸併排序和基數排序
不是穩定的排序演算法:選擇排序、快速排序、希爾排序、堆排序
選擇排序演算法準則:
每種排序演算法都各有優缺點。因此,在實用時需根據不同情況適當選用,甚至可以將多種方法結合起來使用。
影響排序的因素有很多,平均時間複雜度低的演算法並不一定就是最優的。相反,有時平均時間複雜度高的演算法可能更適合某些特殊情況。同時,選擇演算法時還得考慮它的可讀性,以利於軟體的維護。一般而言,需要考慮的因素有以下四點:
1.待排序的記錄數目n的大小;
2.記錄本身資料量的大小,也就是記錄中除關鍵字外的其他資訊量的大小;
3.關鍵字的結構及其分布情況;
4.對排序穩定性的要求。
設待排序元素的個數為n.
1)當n較大,則應採用時間複雜度為o(nlog2n)的排序方法:快速排序、堆排序或歸併排序序。
快速排序:是目前基於比較的內部排序中被認為是最好的方法,當待排序的關鍵字是隨機分布時,快速排序的平均時間最短;
堆排序 : 如果記憶體空間允許且要求穩定性的
歸併排序:它有一定數量的資料移動,所以我們可能過與插入排序組合,先獲得一定長度的序列,然後再合併,在效率上將有所提高。
2)當n較大,記憶體空間允許,且要求穩定性 =》歸併排序
3)當n較小,可採用直接插入或直接選擇排序。
4)一般不使用或不直接使用傳統的氣泡排序。直接插入排序:當元素分布有序,直接插入排序將大大減少比較次數和移動記錄的次數。
直接選擇排序 :元素分布有序,如果不要求穩定性,選擇直接選擇排序
5)基數排序
它是一種穩定的排序演算法,但有一定的侷限性:
1、關鍵字可分解。
2、記錄的關鍵字位數較少,如果密集更好
3、如果是數字時,最好是無符號的,否則將增加相應的對映複雜度,可先將其正負分開排序。
常見八大排序演算法
排序演算法 穩定性平均時間複雜度 最差時間複雜度 空間複雜度 備註堆排序 不穩定o nlogn o nlogn o 1 n大時較好 快速排序 不穩定o nlogn o n 2 o nlogn n較大時好 希爾排序 不穩定o nlogn o n s o 1 s時所選的分組 選擇排序 不穩定o n 2 ...
八大排序 選擇排序
n個資料的檔案可經過n 1趟直接選擇排序得到有序結果。初始狀態 無序區 r 1.n 有序區為空。第一趟排序 在無序區r 1.n 選出下標最小的記錄r 1 通過比較獲得無序區中最小的,將他與無序區的第乙個記錄r 1 交換,使得r 1.1 和r 2.n 成為新的有序區域,和新的無序區域。第i趟排序 第i...
八大排序演算法之選擇排序
選擇排序 selection sort 是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小 或最大 的乙個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。選擇排序是不穩定的排序方法 比如序列 5,5,3 第一次就將第乙個 5 與 3 交換,導致第乙個5挪動到第二個...