淺說數據結構(一):冒泡排序算法

  冒泡排序法能夠說是最簡單也是最多見的算法之一。算法

  因爲本人水平有限,對算法的理解極其淺薄,就不作長篇大論,直接給出簡單的技術總結好了。數組

  怎樣纔算是冒泡排序?學這個算法會很容易產生一個困惑:排序後的數據究竟是從最小值到最大值,仍是從最大值到最小值?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

  第一趟下來就能夠把最大值給「冒泡」出來,第二趟就能夠「冒泡」 出倒數第二大的值……以此類推,直到再也不出現逆序的時候就完成了冒泡排序(通常都是在完成數組最後一個值的排序的時候吧?)。變量

具體遍歷過程以下(只是簡略的描述):循環

 

暫且說這麼多,其餘詳細的以後再補充。有錯漏之處,請各位多多指教。

相關文章
相關標籤/搜索