冒泡排序和選擇排序


冒泡排序(Bubble sort)和選擇排序(Selection sort)

 

  初看冒泡排序和選擇排序不禁會問它們有什么區別? 的確, 它們的基本思想是一樣的. 都是通過一輪的循環找到所要排序數中的最值(最大值或最小值), 然后將最值置於頂端. 它們的區別主要體現在對其他數(非最值)的處理上. 

  冒泡排序: 通過相鄰的兩個數的比較, 根據需要決定是否將兩個數互換位置, 然后將比較往前(或往后)推進. 例如, 要求從小到大排序. 通過將兩個數比較, 將較大的數置換到右邊. 如此不斷循環將得到最值.

  選擇排序: 和冒泡排序不同, 選擇排序使用標記最值所在位置的方式, 查找最值過程中不移動數位置, 只是在最后將最值置換到頂端.

  冒泡排序代碼:

 

 1 void bubblesort(int arrayVal[],int length)
 2 {
 3     int i,j;
 4     int temp;
 5 
 6     for(i=0;i<length-1;i++)
 7         for(j=i+1;j<length;j++)
 8             if(arrayVal[i]>arrayVal[j])
 9             {
10                 //置換位置
11                 temp=arrayVal[i];
12                 arrayVal[i]=arrayVal[j];
13                 arrayVal[j]=temp;
14             }
15 }

 

  選擇排序代碼:

 1 void selectionsort(int arrayVal[],int length)
 2 {
 3     int i,j,max;
 4     int temp;
 5 
 6     for(j=length;j>1;j--)
 7     {
 8         max=0;//標記最值位置
 9         for(i=1;i<j;i++)
10             if(arrayVal[i]>arrayVal[max])
11                 max=i;
12             if(max!=j-1)
13             {
14                 temp=arrayVal[max];
15                 arrayVal[max]=arrayVal[j-1];
16                 arrayVal[j-1]=temp;    
17             }
18     }
19 
20 }

 

  從上兩段代碼可以看出,它們處於同一個數量級,即時間復雜度是相同的,都用了兩層循環,為O(n^2)(n:排序個數); 但是內層循環中,冒泡排序的互換位置的操作從概率上講要明顯多於選擇排序. 整個排序算法,選擇排序換位操作為O(n),二冒泡排序為O(n^2/2). 所以綜合來講選擇排序的時間效率要高於冒泡排序.

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM