資料結構之排序演算法

2021-08-08 18:21:18 字數 1601 閱讀 9926

總結:一、穩定性:

穩定:氣泡排序、插入排序、歸併排序和基數排序

不穩定:選擇排序、快速排序、希爾排序、堆排序

二、平均時間複雜度

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...