前提
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 第二次交換...