冒泡排序法能夠說是最簡單也是最多見的算法之一。算法
因爲本人水平有限,對算法的理解極其淺薄,就不作長篇大論,直接給出簡單的技術總結好了。數組
怎樣纔算是冒泡排序?學這個算法會很容易產生一個困惑:排序後的數據究竟是從最小值到最大值,仍是從最大值到最小值?spa
答案是:從最小值到最大值。到底從最大值到最小值算是什麼算法,本人是不清楚的。(或者也算冒泡排序或不存在?知道的大牛請指教。)code
很少說,直接給出算法代碼:blog
for(i = 1;i < n;i++){ for(j = 0;j<n - i;j++) if(arr[j + 1] < arr[j]){ temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] =temp; } }
代碼分析:排序
這段代碼中嵌套了兩層for循環語句。其中,第一層是算法計算的趟數(大概能夠理解爲遍歷數組的次數),能夠看到要完成整個算法,先後需 要經歷n-1趟。須要注意的是,第一層的變量i是不參與遍歷數組的,也就是說,無論數組須要怎樣比較都與i無關,它的做用僅僅在於記錄遍歷的趟數,還有做爲「倒計時」(即第二層for循環語句中的"j < n- i")。for循環
第二層是一趟對數組遍歷排序中的操做。上面說過,儘管這個算法須要兩個變量,但參與比較的僅僅只有j一個變量。我是迷糊了好久才終於注意到了這一點(一直都覺得是拿arr[i]和arr[j]比較啊,悲催啊~~)。須要注意的是它的排序過程,根據它的排序結果,是從最小值到最大值,也就是說,整個算法的目的都在於把最大值「冒泡」到數組的最末尾的位置。算法中出現須要對先後數據進行交換的狀況只有「前一個數據大於後一個數據」(咱們稱之爲「逆序」)的時候,也就是"arr[j + 1] < arr[j]"的時候。class
第一趟下來就能夠把最大值給「冒泡」出來,第二趟就能夠「冒泡」 出倒數第二大的值……以此類推,直到再也不出現逆序的時候就完成了冒泡排序(通常都是在完成數組最後一個值的排序的時候吧?)。變量
具體遍歷過程以下(只是簡略的描述):循環
暫且說這麼多,其餘詳細的以後再補充。有錯漏之處,請各位多多指教。