冒泡排序
什么是冒泡排序
如果大家平常有觀察水泡浮出水面的情況就可以發現水泡由下網上冒的過程中水泡是逐漸增大的,當水泡上升到即將浮出水面的時候往往是水泡最大的時候,如下圖所示。

冒泡排序的原理跟這個情況很類似,讓子序列中的最大元素不斷沉底,達到排序的目的。說白了,冒泡排序一共經過N-1次遍歷,其中第i次遍歷前N-i個元素(第i+1到N個元素已經排序完畢),將第i大的元素移動到N-i的位置 。
冒泡排序的過程可描述如下:
令A表示進行排序的數組,N表示A的長度,A[i]表示數組A第i+1個元素,i=1,1,2,3...N
第一次遍歷:
從i=0開始,遍歷前N個元素,如果A[i]>A[i+1],則交換A[i]與A[i+1]的值,第一次遍歷將前N個元素中的最大值將會出現第N個位置上;
第二次遍歷:
從i=0開始,遍歷前N-1個元素,如果A[i]>A[i+1],則交換A[i]與A[i+1]的值,第二次遍歷將前N-1個元素中的最大值將會出現第N-1個位置上;
……
第N-1次遍歷:
最后一次遍歷就是對比A[0]和A[1],若A[0]>A[1],則交換兩者的位置,排序結束;否則,不進行交換,排序結束。
冒泡過程演示
對數組A={14,5,16,4,7,9}從小到大進行排序,冒泡排序的過程如下:
第一次遍歷:

第二次遍歷:

第三次遍歷:

最后一次遍歷:

C++版代碼實現
1 #include "stdafx.h" 2 #include <iostream> 3 using namespace std; 4 void BubbleSOrt(int *values,int length){ 5 int temp=0; 6 for(int i=length-1;i>0;i--){ 7 for(int j=0;j<i;j++){ 8 if(*(values+j)>*(values+j+1)){ 9 temp=*(values+j); 10 *(values+j)=*(values+j+1); 11 *(values+j+1)=temp; 12 } 13 } 14 } 15 } 16 int main(int argc, _TCHAR* argv[]) 17 { 18 int values[]={14,5,8,20,13,11}; 19 BubbleSOrt(values,6); 20 for(int i=0;i<6;i++){ 21 cout<<*(values+i)<<endl; 22 } 23 return 0; 24 }
