排序可分為兩種:內排序和外排序。在排序過程中,全部記錄存放在記憶體,稱為內排序;如果排序過程中需要使用外存,則成為外排序。
內排序有以下幾類:
直接插入排序、氣泡排序和簡單選擇排序是基本的排序方法。它們平均情況下的時間複雜度都是o(
n2) ,它們的實現也都非常簡單。
直接插入排序對於規模很小的元素序列(n
≤25) ,可以說是非常有效的。它的時間複雜度與待排序元素序列的初始排列有關。在最好情況下,直接插入排序只需要n-1次比較就可以完成,而且不需要交換。在平均情況下和最差情況下,直接插入排序的比較和交換都是o(
n2) 。
改進的氣泡排序在最好情況下只需要一趟冒泡過程就可以完成,此時也只需要n−
1 次比較就可以了。
簡單選擇排序的排序碼比較次數與待排序元素序列的初始排列無關,其比較次數總是o(
n2) ,但元素移動次數則與待排序元素序列的初始排列有關,最好情況下一次也不移動,最差情況下元素移動次數不超過3(
n−1)
次。 從記憶體複雜度來看,這三種基本的排序方法除了乙個輔助元素外,都不需要其他額外的記憶體空間。從穩定性來看,直接插入排序和氣泡排序都是穩定的,但簡單選擇排序不是。它們主要用於元素個數n不是很大
(<10k
) 的情形。
快速排序是最通用的高效的內部排序演算法,平均情況下的時間複雜度為o(
nlog
2n) ,一般情況下所需要的額外記憶體也是o(
log2
n)。但是快速排序是個不穩定的演算法。並且在有些情況下可能會退化(例如元素序列已經有序時),時間複雜度會增加到o(
n2) ,空間複雜度也會增加到o(
n)。改進的快速排序演算法,即三路劃分的快速排序演算法,能夠有效地避免最壞情況的發生。
堆排序也是一種高效的內部排序演算法,它的時間複雜度是o(
nlog
2n) ,而且沒有什麼最壞情況會導致堆排序的執行明顯變慢,並且堆排序基本不需要額外的記憶體空間。但堆排序不太可能提供比快速排序更好的平均效能。堆排序是一種不穩定的排序演算法。
歸併排序也只乙個重要的高效排序演算法它的效能與輸入元素序列無關,時間複雜度總是o(
nlog
2n) 。但它的主要缺點是直接執行時需要o(
n)的附加記憶體空間,雖然有方法可以克服這個缺點,但是其代價是演算法會很複雜且時間複雜度會增加,因此在實際應用中一般不值得這樣做。歸併排序演算法是一種穩定的高效排序演算法。
快速排序、堆排序和歸併排序適合於元素個數n很大的情況。
希爾排序的時間複雜度介於基本排序演算法和高效排序演算法之間,雖然迄今為止對其效能的分析還是不精確的,但是希爾排序**簡單,基本不需要什麼額外記憶體,空間複雜度低。希爾排序是一種不穩定的排序演算法。對於中等規模的元素序列(n
≤1000
) ,希爾排序是一種很好的選擇。
基數排序是一種相對特殊的排序演算法,這類演算法不僅是對元素序列的排序碼進行比較,更重要的是它們對排序碼的不同部分進行處理和比較。雖然基數排序具有線性增長的時間複雜度,但是由於在常規程式設計環境中,關鍵字索引統計程式內部迴圈中包含大量操作,其數目比快速排序或者歸併排序演算法的內部迴圈多得多。所以基數排序的線性時間開銷實際上不比快速排序的時間開銷小很多。並且由於基數排序基於的排序碼抽取演算法受到作業系統和排序元素的影響,其適應性遠不如普通的比較和交換操作。因此在實際工作中,常規的高效排序演算法如快速排序的應用要比基數排序廣泛得多。
排序方法
時間複雜度
空間複雜度
穩定性直接插入排序
o(n2)
o(1)
是二分法插入排序
o(nlog2n)
o(1)
是希爾排序
-o(1)
否簡單選擇排序
o(n2)
o(1)
否堆排序
o(nlog2n)
o(1)
否氣泡排序
o(n2)
o(1)
是快速排序
o(nlog2n)
o(log2n)
否歸併排序
o(nlog2n)
o(n)
是基數排序
o(d(n+rd))
o(rd)
是
java 經典排序演算法
1 氣泡排序 bubble sort 最簡單的排序方法是氣泡排序方法。這種方法的基本思想是,將待排序的元素看作是豎著排列的 氣泡 較小的元素比較輕,從而要往上浮。在氣泡排序演算法中我們要對這個 氣泡 序列處理若干遍。所謂一遍處理,就是自底向上檢查一遍這個序列,並時刻注意兩個相鄰的元素的順序是否正確。...
經典排序演算法 氣泡排序演算法及其優化(穩定)
氣泡排序就是把小的元素往前調或者把大的元素往後調。比較是相鄰的兩個元素比較,交換也發生在這兩個元素之間。所以,如果兩個元素相等,我想你是不會再無聊地把他們倆交換一下的 如果兩個相等的元素沒有相鄰,那麼即使通過前面的兩兩交換把兩個相鄰起來,這時候也不會交換,所以相同元素的前後順序並沒有改變,所以氣泡排...
經典排序演算法(Java版)
1 氣泡排序 bubble sort 最簡單的排序方法是氣泡排序方法。這種方法的基本思想是,將待排序的元素看作是豎著排列的 氣泡 較小的元素比較輕,從而要往上浮。在氣泡排序演算法中我們要對這個 氣泡 序列處理若干遍。所謂一遍處理,就是自底向上檢查一遍這個序列,並時刻注意兩個相鄰的元素的順序是否正確。...