總結:一、穩定性:
穩定:氣泡排序、插入排序、歸併排序和基數排序
不穩定:選擇排序、快速排序、希爾排序、堆排序
二、平均時間複雜度
o(n^2):直接插入排序,簡單選擇排序,氣泡排序。
在資料規模較小時(9w內),直接插入排序,簡單選擇排序差不多。當資料較大時,氣泡排序演算法的時間代價最高。效能為o(n^2)的演算法基本上是相鄰元素進行比較,基本上都是穩定的。
o(nlogn):快速排序,歸併排序,希爾排序,堆排序。
其中,快排是最好的, 其次是歸併和希爾,堆排序在資料量很大時效果明顯。
三、排序演算法的選擇
1.資料規模較小
(1)待排序列基本序的情況下,可以選擇直接插入排序;
(2)對穩定性不作要求宜用簡單選擇排序,對穩定性有要求宜用插入或冒泡
2.資料規模不是很大
(1)完全可以用記憶體空間,序列雜亂無序,對穩定性沒有要求,快速排序,此時要付出log(n)的額外空間。
(2)序列本身可能有序,對穩定性有要求,空間允許下,宜用歸併排序
3.資料規模很大
(1)對穩定性有求,則可考慮歸併排序。
(2)對穩定性沒要求,宜用堆排序
4.序列初始基本有序(正序),宜用直接插入,冒泡
1.選擇排序:
描述:先找出數列中最大的數,放在數列最後一位,然後在剩下數中找出最大的放在數列倒數第二位,以此類推。
2.插入排序
描述:從數列第乙個元素開始,當第二元素小於第乙個元素,將第二個元素放置第一位,以此類推,第三個元素分別比較大小,插入前兩元素之前。
3.快速排序
描述:從數列中找出乙個基準數,然後建立比基準數大和小的兩個子數列,然後對這兩個子數列遞迴快速排序,一般情況當子數列元素個數小於15時盡量採取插入排序或者選擇排序。
直接上**:
public
class
quicksorttest
//獲得劃分數列的基準值
int index=partion(data,start,end);
//分別遞迴比基準值小和大的元素數列
quicksort(data,start,index-1);
quicksort(data,index+1,end);
}private
intpartion(int data, int start, int end)
public
static
void
main(string args) ;
quicksorttest quicksorttest=new quicksorttest();
quicksorttest.quicksort(data,0,data.length-1);
for (int i:data)
}}
4.堆排序
前提:根據二叉堆的性質,一全序排列,二完全二叉樹,即除根節點外每個結點盡量有多個子節點,葉子結點盡量靠左。
步驟:建堆,堆調整(向下堆重排),堆排序
描述:將數列轉化為堆,然後從堆中取出最大值,一次時間複雜度為
log(n),依次在剩下的元素中取出最大值。
資料結構之排序演算法
1.插入排序 直接插入排序 include void insertsort int unsort int length unsort j temp int main void insertsort num,7 int i 0 for i i 7 i return 0 折半插入排序 include v...
資料結構之排序演算法
學過好久的東西,感覺都忘記的差不多了,雖然可能日常寫 的過程之中也可能寫過一些演算法,但是從來都沒有規整,最近忙裡偷閒,寫點關於排序的演算法,當然好多人都寫過一些很不錯的演算法blog,我寫一下,只是方便自己日後檢視,當然也給有需要的朋友一些參考,歡迎指正 排序演算法有 氣泡排序,選擇排序,插入排序...
資料結構之排序演算法
1 直接插入排序 將乙個記錄插入到已經排好序的有序表中,只有當排序結束時每個元素才能進入到正確的位置,複雜度為o n2 優點 演算法簡單 易行,當待排序記錄數量較少時,該演算法非常有效 缺點 資料規模較大時,效率比較低。演算法insertsort r,n insertsort1.插入排序 for j...