排序系列算法——冒泡排序

冒泡排序

什么是冒泡排序

如果大家平常有观察水泡浮出水面的情况就可以发现水泡由下网上冒的过程中水泡是逐渐增大的,当水泡上升到即将浮出水面的时候往往是水泡最大的时候,如下图所示。

冒泡排序的原理跟这个情况很类似,让子序列中的最大元素不断沉底,达到排序的目的。说白了,冒泡排序一共经过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 }

 

posted on 2015-12-20 11:10  学会分享~  阅读(4964)  评论(0编辑  收藏  举报

导航