1.冒泡排序
冒泡排序(Bubble Sort)是編程中較簡單的一種排序算法。它重復(fù)地走訪要排序的數(shù)列,一次比較兩個(gè)元素,如果它們的順序錯(cuò)誤,就把它們交換過來。重復(fù)地進(jìn)行走訪數(shù)列的工作直到?jīng)]有再需要交換的元素,這也就意味著該數(shù)列已經(jīng)完成排序。
冒泡排序就像氣泡從水中出現(xiàn)一樣,在氣泡排序中最小或最大的數(shù)字,取決于我們是按升序還是降序排序數(shù)組,氣泡朝著數(shù)組的開始或結(jié)束冒出。
2.冒泡排序的算法原理
1)比較相鄰的元素,如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)。
2)對(duì)每一對(duì)相鄰元素做同樣的工作,從開始第一對(duì)到結(jié)尾的最后一對(duì),在這一點(diǎn),最后的元素應(yīng)該會(huì)是最大的數(shù)。
3)針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè)。
4)持續(xù)對(duì)越來越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對(duì)數(shù)字需要比較。
3.冒泡排序的復(fù)雜度和性能
與其他排序算法,諸如快速排序、歸并排序或shell排序相比,冒泡排序表現(xiàn)不佳。這些算法的平均情況復(fù)雜度為O(nlogn),而冒泡排序平均情況復(fù)雜度為O(n^2)。
在最佳情況下,冒泡排序比具有O(n)性能的快速排序更好。冒泡排序比快速排序或歸并排序慢三倍,即使n=100,但它更容易實(shí)現(xiàn)和記憶。
冒泡排序的復(fù)雜度和性能如下:
1)冒泡排序最差情況性能O(n^2)
2)冒泡排序最佳情況性能O(n)
3)冒泡排序平均情況性能O(n^2)
4.形成代碼
//冒泡排序 public static void bubbleSort(int[] arr) { //外層循環(huán)用來控制數(shù)組循環(huán)的圈數(shù) for(int i=0;i<arr.length-1;i++) { //內(nèi)層循環(huán)用來完成元素值比較,把大的元素值互換到后面 for(int j=0;j<arr.length-1-i;j++) { if(arr[j] > arr[j+1]) { int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } //輸出結(jié)果 for(int n:nums) { System.out.println(n); } }
例如:
public class Main { public static void main(String[] args) { int a[] = {6,1,15,32,9}; for(int i=1;i<a.length;i++) { for(int j=0;j<a.length-1;j++) { if(a[j] > a[j+1]) { int temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; } } } System.out.println("冒泡排序的結(jié)果是:"); for(int temp:a) { System.out.print(temp+" "); } } }
運(yùn)行結(jié)果如下:
冒泡排序的結(jié)果是: 1 6 9 15 32
大家可以親自上機(jī)實(shí)驗(yàn)!
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會(huì)寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程
從零到寫出一個(gè)爬蟲的Python編程課程
只會(huì)語法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程