冒泡排序过程
1.首先比較相邻的两个元素,假设前面数据大于后面数据的话,就将这两个数进行交换,依次推,直到完毕第N-1个记录与第N个记录交换为止(第一趟起泡)。
2.然后再进行第二趟气泡。由第一趟气泡,可知末尾是最大数,所以第二趟之比較前N-1个数
3.第三趟…… 比較N-2个数
...................................................................................
冒泡分析
通过上述的过程分析,能够知道冒泡就好比一个倒置的三角形。
第一次气泡,比較N次
第二次气泡,比較N-1次
.....................
如图三角形所看到的
代码分析
由上面分析的冒泡过程,我们在代码实现上也就简单多了。
1.有一个前后两个数交换的过程。
2.有一个交换次数递减的过程
代码实现
<span style="font-family:SimSun;font-size:18px;"> /// <summary> /// 冒泡排序法实现过程 /// </summary> /// <param name="a">数组a用来保存要排序的数字</param> /// <param name="n">数组元素的个数</param> void BubbleSort(int[] a, int n) { int i,j,c; //外层循环,用来辅助,每次递减的次数 for(i=0;i<n;i++) { //里层循环用来做前后两个数的交换 for(j=1;j<n-i;j++) { //两个数交换的过程 if(a[j-1]>a[j]) { //引入第三者,做辅助 c = a[j - 1]; a[j - 1] = a[j]; a[j] = c; } } } }</span>
代码分析,上面的代码也能够做优化,由于假设在一次循环过程中,都没有经过交换的话,那么我们能够知道,此次排序就已经完毕了,就不用接着在进行比較推断了,因此我们能够设置一个标志位,来进行推断。
<span style="font-family:SimSun;font-size:18px;"> static void BubbleSort(int[] a, int n) { int i,j,c; bool flag; //外层循环,用来辅助,每次递减的次数 for(i=0;i<n;i++) { flag = false;//设置一个标志位,默认值为false //里层循环用来做前后两个数的交换 for(j=1;j<n-i;j++) { //两个数交换的过程 if(a[j-1]>a[j]) { //引入第三者,做辅助 c = a[j - 1]; a[j - 1] = a[j]; a[j] = c; flag = true; //假设发生交换的话,标志位就为true } } //在此来推断标志位,假设为false的话,证明没有进行交换,因此就已经排序好了,能够直接停止过程了 if (!flag) break; } }</span>
假设明确了冒泡排序的本质后,对于代码也就好实现的多了,要记住上述倒置的三角形,明确两点。
1.比較次数在较少
2.前后做比較
因此上述的代码我们也能够用while语句写,事实上都是一样的
<span style="font-family:SimSun;font-size:18px;"> //优化后的冒泡算法 static void BubbleSort2(int []a,int n) { int j; bool flag; int c; //标志位 flag =true ; while(flag) { flag =false ; for(j=1;j<n;j++) { if(a[j-1]>a[j]) { c = a[j - 1]; a[j - 1] = a[j]; a[j] = c; flag = true; } } //次数递减 n--; } }</span>
学习心得
网上这样的排序的代码非常多,仅仅要你可以理解本质,应用起来也就不费事了。可是理解本质的前提是须要做大量的写写画画的操作。别人的东西,永远是别人的,所以我们要通过研究来化为己有,可以做到为我所用。