今天來學一下十大排序
首先,我們先了解下各個排序的時間複雜度:
冒泡、選擇、插入、歸併、快速、希爾、堆排序屬於比較排序
在這裡,我們預設排序是從小到大排序。
乙個動態演示各種排序演算法的動畫**:visualgo
如果相等的兩個元素,在排序前後的相對位置保持不變,那麼這個演算法是穩定的排序演算法。
比如 5 1 3a 4 7 3b
穩定排序:1 3a 3b 4 5 7
不穩定排序:1 3b 3a 4 5 7
對於自定義物件,穩定、不穩定排序還是有很大影響的。
官方點的語言:
執行流程:
1 從頭開始比較每一對相鄰元素,如果第1個比第2個大,就交換它們的位置。執行完一輪後,最末尾那個元素就是最大的元素。
2 忽略1中曾經找到的最大元素,重複執行步驟1,直到全部元素有序。
首先,我們考慮,如何兩兩比較,將最大值找到並放在最末尾。
public
class
sort
;for
(int begin =
1; begin < array.length; begin++)}
for(
int i =
0; i
}
以上,是一次迴圈後,找出最大值,放入最後面。
後面,我們需要繼續迴圈除去最後乙個值的剩餘元素,找出最大值,放在新的迴圈的最末尾。
然後,考慮比較時,
第1次比較的末尾索引值是array.length - 1
第2次比較的末尾索引值是array.length - 2
第3次比較的末尾索引值是array.length - 3
第k次比較的末尾索引值是array.length - k
第0個位置與第0個位置,不需要比較
也就是最後的末尾值是1
也就是end的取值範圍是1 到 array.length - 1
因而,不難寫出**:
public
class
sort
;for
(int end = array.length -
1; end >
0; end--)}
}for
(int i =
0; i
}
當然,之前自己這樣寫過氣泡排序:
第一種寫法,在begin、end上變數名取的好,比直接使用i,j好理解
第一種寫法,基本上按照了氣泡排序的思路直接寫出來的
第二種寫法,手寫的時候好寫,寫法也好看,i,j都從0開始,並且都是++操作。不像第一種寫法,第一層迴圈–,第二層++。
不過,還是第一種思路上好理解。
對於上面的氣泡排序,迴圈兩遍,很容易看出其時間複雜度為o(n^2)
假如,給我們的陣列本身就是有序的,如果用之前的**,程式會按部就班的執行,時間複雜度還是o(n^2)。但事實上,如果陣列本身就是有序的,我們就不需要進行氣泡排序演算法,直接列印出結果即可。也就是,我們可以對上述**做優化
如果序列已經完全有序,可以提前終止氣泡排序
定義乙個變數sorted,如果從begin到end比較一遍,發現從頭到尾沒有發生交換,說明陣列是有序的。然後end–,數量變小,依然是有序的,所以,可以直接結束迴圈。
比如 1 2 3 4 6 5
第一次迴圈過後,就是有序的,1 2 3 4 5 6
第二次迴圈,發現是有序的,直接結束列印。
public
class
sort
;for
(int end = array.length -
1; end >
0; end--)}
if(sorted)
}for
(int i =
0; i
}
這個效率,一般來說,優化過後的執行時長要比沒有優化的原生**時長要長。
畢竟,優化的**,裡面多了三行**。
優化過後的氣泡排序,適用於待排序陣列,接近有序的時候。
如果序列已經區域性有序,可以記錄最後一次交換的位置,減少比較次數
//既然sortedindex已經有了,那麼,下次結束的時候,就是最後交換的位置
end = sortedindex;
}for
(int i =
0; i
}最壞時間複雜度o(n^2),1 + 2 +3 + … + n-1
最好時間複雜度,只需要遍歷一遍o(n)
空間複雜度,不需要借助其他空間o(1)
可以發現,第二個優化方案還是很有效果的。
資料結構與演算法 排序 氣泡排序
兩兩相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄為止。氣泡排序基本概念是 依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟 首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。至此...
資料結構與演算法 氣泡排序
氣泡排序的思想是,從前往後 或從後往前 掃瞄,每找乙個逆序對,就將它更正過來,這樣每一輪總可以找到乙個最大值或最小值。1 從前往後掃瞄,每次找到的較大值插入到後面,第一層迴圈代表當前插入位置。public static void sinksort int nums,int start,int end...
資料結構與演算法 氣泡排序
氣泡排序是一種穩定排序演算法,因為排序過程每次都把其中最大的數或者最小的數上移直至頂端,因此叫氣泡排序。排序過程 依次交換相鄰的兩個數 第一次選出最大的數,第二次選出第二大的數,依次進行,直至n 1個數字置,最後乙個數不用排。複雜度 o n 實現 include using namespace st...