新聞中心
雞湯給大家備好了:

創(chuàng)新互聯(lián)公司從2013年開始,是專業(yè)互聯(lián)網技術服務公司,擁有項目網站制作、成都做網站網站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元紅河做網站,已為上家服務,為紅河各地企業(yè)和個人服務,聯(lián)系電話:18982081108
歲月流逝是多么殘酷啊,對我們也是如此,不要把時間浪費在不重要的人和事情上!
在計算機科學中,排序是一個經典的主題。學習排序算法的好處有三:
1.創(chuàng)造性解決問題
2.練習和鞏固程序設計技能
3.演示算法性能的極好例子
冒泡排序屬于比較簡單的一種排序方法。但是,很多同學到現(xiàn)在也不能手寫一個冒泡排序。甚至經過和一些剛畢業(yè)甚至工作一兩年的朋友交流后,發(fā)現(xiàn)他們內心對算法,抱著深深的恐懼和盲目崇拜,覺得算法好像高不可攀,只適合那些高學歷、高智商的人來學習和研究!今天,我想把這篇獻給他們,希望他們能樹立起學習的勇氣和信心!
1.什么是冒泡排序
冒泡排序算法需要遍歷幾次數(shù)組,在每次遍歷中,比較連續(xù)相鄰的元素。如果一對元素是降序排列,則互換他們的位置,否則保持不變。這樣一來,使得較小的值像“氣泡”一樣,逐漸浮向頂部,而較大的值沉入底部,因此稱這種排序方法為冒泡排序(bubble sort )或下沉排序(sinking sort)。
第一次遍歷之后,最后一個元素將成為最大的元素。第二次遍歷之后,倒數(shù)第二個元素,將成為倒數(shù)第二大的元素。整個過程持續(xù)到所有的元素全部都已排好序。
2.圖解冒泡排序
經過第一次遍歷后,最大的數(shù)已經在數(shù)組末尾。因為最后一個數(shù)已經是最大數(shù),因此不需要再考慮最后一對元素。
經過第二次遍歷,后兩個數(shù)已經排好序,所以只需要對除它們之外的元素進行排序。
因此,在進行第n次遍歷時,不需要考慮倒數(shù)第n-1個元素,因為它們已經排好序了!
冒泡排序偽代碼:
- for(int k = 1; k < list.length; k++){
- for(int j = 0; j < list.length-k; j++) {
- if(list[j] > list[j + 1]) {
- swap(list[i], list[i + 1]);
- }
- }
- }
3.改進后的冒泡排序
注意到,上面的排序實際上有很多次沒有發(fā)生交換,因此,我們可以對冒泡排序稍微改進下:
- boolean nextPass = true;
- for(int k = 1; k < list.length && nextPass; k++){
- nextPass = false;
- for(int j = 0; j < list.length-k; j++) {
- if(list[j] > list[j + 1]) {
- swap(list[i], list[i + 1]);
- nextPass = true;
- }
- }
- }
4. 冒泡排序時間復雜度
最佳情況下,冒泡排序只需要一次遍歷就能確定數(shù)組已排好序,不需要再進行下一次遍歷。因此,最佳情況下,冒泡排序時間復雜度為O(n)。
最壞情況下,冒泡排序需要 次。因此比較總次數(shù)為: $$ (n-1) + (n-2) + (n-3) + ...+ 3 + 2 + 1 = ({\frac n2^2} - {\frac n2}) = O(n^2) $$ 所以,最壞情況下,冒泡排序的時間復雜度為:O(n^2)。
5. 附上函數(shù)
- public static void bubbleSort(int[] list) {
- boolean nextPass = true;
- for(int k = 1; k < list.length && nextPass; k++){
- nextPass = false;
- for(int j = 0; j < list.length-k; j++) {
- if(list[j] > list[j + 1]) {
- int tmp = list[j];
- list[j] = list[j+1];
- list[j+1] = tmp;
- nextPass = true;
- }
- }
- }
- }
本文轉載自微信公眾號「鍋外的大佬」,可以通過以下二維碼關注。轉載本文請聯(lián)系鍋外的大佬公眾號。
本文題目:看完了這篇,面試的時候人人都能單手擼冒泡排序!
本文路徑:http://m.5511xx.com/article/cdjphgh.html


咨詢
建站咨詢
