氣泡排序,插入排序

2021-06-29 06:07:13 字數 1370 閱讀 3960

前提

void x_sort ( elementtype a, int n )

 大多數情況下,為簡單起見,討論從小大的整數排序

 n是正整數

 只討論基於比較的排序(> = < 有定義)

 只討論內部排序

 穩定性:任意兩個相等的資料,

排序前後的相對位置不發生改變

 沒有一種排序是任何情況下

都表現最好的

氣泡排序

void bubble_sort(elementytype a, int n)

}if(flag == 0) break; //全程無交換,跳出迴圈}}

最好情況: 順序t= o(n)

最壞情況:逆序 o(n^2)

相等的不做交換,嚴格遞增的才交換, 穩定排序

單向鍊錶 儲存 怎麼排序呢 

直接插入排序:

void insertion_sort(elementtype a, int n)

}

不用哨兵,假設最初手裡有一張牌了,然後起到新牌插到手裡

如果序列基本有序,簡單高效

最好情況:順序t = o( n )

最壞情況:逆序t = o( n2 )

時間複雜度下界

 對於下標ia[j],則稱(i,j)是

一對逆序對(inversion)

 問題:序列中有多少逆序對?

 交換2個相鄰元素正好消去1個逆序對!

 插入排序:t(n, i) = o( n+i )

—如果序列基本有序,則插入排序簡單且高效

定理:任意n個不同元素組成的序列平均具有

n ( n - 1 ) / 4 個逆序對。

 定理:任何僅以交換相鄰兩元素來排序的算

法,其平均時間複雜度為 ( n2 ) 。

 這意味著:要提高演算法效率,我們必須

 每次消去不止1個逆序對!

 每次交換相隔較遠的2個元素!

希爾排序

定義增量序列dm > dm-1 > … > d1 = 1

 對每個dk 進行「dk-間隔」排序( k = m, m-1, … 1 )

 注意:「dk-間隔」有序的序列,在執行「dk-1-間隔」排序後,仍然是「dk-間隔」有序的

增量元素不互質,更多增量序列

希爾排序如此簡單,但是關於他的複雜度分析非常難

氣泡排序 插入排序

學習思路 思路講解 實現 1 通過雙重迴圈,相鄰兩個資料做對比,通過位置交換使其變得有序 2 時間複雜度 分析 解釋 外部迴圈從0開始i 內部迴圈從0開始j,完整迴圈後會將本次最大值放入陣列最後,下次迴圈可忽略相應的尾部資料 length i 1 重複1 2步即可完成排序 實現 public cla...

氣泡排序,選擇排序,插入排序

氣泡排序,選擇排序,插入排序 小規模的檔案以及基本有序的檔案,插入排序的效能比快速排序的效能更為有效一些,實際上,插入排序通常也做快速排序實現的一部分。1 氣泡排序 packagedatastrut public classbubblesort public voidinsert longvalue...

排序演算法 氣泡排序 插入排序

氣泡排序 步驟1 從第乙個元素開始與它的下乙個元素比較,如果比下乙個元素大,交換兩個元素的位置 如果小於或者相等,保持不變。每次交換可以保證有序的佇列長度增加1。步驟2 重複步驟1,一直到整個佇列全部有序為止。比如對於序列5,4,3,2,1,經過第一次交換後佇列改變為 4,3,2,1,5 第二次交換...