內部排序算法主要分爲插入類排序、交換類排序和選擇類排序,它們在性能上的差別主要體如今時間複雜度、空間複雜度和穩定性。各類排序算法都會進行元 素間的比較和移動,時間複雜度主要由整個排序過程當中的比較次數和移動次數決定。空間複雜度體如今除了待排序記錄自己所佔的空間,排序過程當中佔用了多少輔助 空間。算法
直接插入排序性能
若是待排序記錄之間是順序排列,此時整個排序過程當中元素比較的次數爲n-1次,移動次數爲0次。若是待排序記錄 之間是逆序排列,第i趟排序比較次數爲i,移動的次數爲i+1,其中i的範圍是2到n。所以,整個排序過程當中元素的比較次數爲(n+2)(n-1)/2, 移動次數爲(n+4)(n-1)/2。blog
直接插入排序算法的時間複雜度爲O(n^2),空間複雜度爲O(1)。從直接插入排序算法的實現能夠發現,位置靠後的記錄是不可能插入到相同大小的記錄以前的,所以直接插入排序算法是穩定的。排序
折半插入排序get
折半插入排序算法與直接插入排序算法相比,每趟的比較次數爲log2^i,所以總體的比較次數爲O(nlog2^n)。可是折半算法的移動次數較直接插入算法並未改變。it
折半算法的時間複雜度仍然是O(n^2),空間複雜度爲O(1)。從算法實現能夠看出折半插入排序算法是穩定的。io
希爾排序table
希爾排序利用了當「待排序記錄n較小,序列基本有序」時使用直接插入算法性能較好這一特色而改進。希爾排序算法的時間複雜度爲O(n^1.5),空 間複雜度爲O(1),它是不穩定的排序算法。舉反例以下:待排序序列爲{2,4,1,(2)},設delta[1]=2,則一趟排序後序列爲{1, (2),2,4}。方法
冒泡排序im
當待排序記錄逆序排列時,每趟冒泡算法進行i次比較和3i次交換(兩個元素交換),i的範圍是1到n-1。所以總的比較次數爲n(n-1)/2,總的移動次數爲3n(n-1)/2。冒泡排序算法的時間複雜度爲O(n^2),空間複雜度O爲(1),是一種穩定的排序算法。
快速排序
快速排序最好的狀況是每次將待排序的記錄都等分爲二,此時時間複雜度爲O(nlog2^n)。最壞狀況下,待排序記錄已經排好序,此時總共的比較次數爲n(n-1)/2,此時時間複雜度爲O(n^2)。
快速排序的平均複雜度爲O(nlog2^n),空間複雜度爲O(log2^n),它是一種不穩定的排序算法。舉反例以下:待排序序列爲{3,2,(2)},則一趟排序後記錄爲{(2),2,3}。
簡單選擇排序
不管待排序記錄的初始排列如何,簡單選擇排序總的比較次數總爲n(n-1)/2,由於它每趟比較的次數爲n-i,i的範圍從1到n-1。最好的狀況下,簡單選擇排序算法的移動次數爲0,最壞狀況下移動的3(n-1)。
簡單選擇排序算法的時間複雜度爲O(n^2),空間複雜度爲O(1),它是不穩定的排序算法。舉反例以下:待排序記錄爲{6,8,(6),2,7},一趟排序後記錄爲{2,8,(6),6,7},二趟排序後記錄爲{2,(6),8,6,7}。
堆排序
堆排序的時間複雜度爲O(nlog2^n),空間複雜度爲O(1),它是不穩定的排序算法。
歸併排序的時間複雜度爲O(nlog2^n),空間複雜度爲O(n),它是穩定的排序算法。
綜上所述,內部排序算法的時間複雜度、空間複雜度和穩定性總結以下表:
1.直接插入排序、折半插入排序、冒泡排序和簡單選擇排序合稱爲簡單排序,它們的時間複雜度均爲O(n^2),空間複雜度爲O(1)。穩定性方面只有簡單選擇排序是不穩定的排序算法。簡單排序只適合n較小的狀況。
2.當待排序記錄基本有序時,直接插入排序是最佳的排序算法。它常與快速排序和歸併排序等結合使用,由於這些算法會將整個打排序記錄劃分爲若干個子記錄,這些子記錄數量較小並且基本有序。
3.排序性能較好的有希爾排序、快速排序、堆排序和歸併排序,除了希爾排序的時間複雜度爲O(n^1.5),其餘排序算法均爲O(nlogn)。雖 然快速排序最壞狀況下時間性能降低爲O(n^2),可是就平均性能而言快速排序算法是最好的。堆排序和歸併排序的性能比較穩定,當n比較大時,歸併排序的 性能比堆排序要好,可是它須要的輔助空間卻爲O(n)。
4.全部的排序算法中,不穩定的算法有簡單選擇排序、希爾排序、快速排序和堆排序。性能較好的排序算法中只有歸併排序是穩定的。排序是按記錄的主關鍵字進行的,此時不用考慮排序方法的穩定性。若是排序是按記錄的次關鍵字進行的, 則應充分考慮排序方法的穩定性。