zoukankan      html  css  js  c++  java
  • 让算法会说话之冒泡排序

    转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/25972987

    冒泡排序:它反复地走訪过要排序的数列,一次比較两个元素,假设他们的顺序错误就把他们交换过来。走訪数列的工作是反复地进行直到没有再须要交换。也就是说该数列已经排序完毕。

    这个算法的名字由来是由于越小的元素会经由交换慢慢“浮”到数列的顶端。


    一.冒泡排序算法以及优化

    1.经常使用代码

    /***************************************************************
    *版权全部 (C)2014,公司名称。
    *
    *文件名:冒泡排序法
    *内容摘要:无
    *其他说明:无
    *当前版本号:V1.0
    *作   者:若云流风
    *完毕日期:2014.5.15
    ***************************************************************/
    #include <stdio.h>
    
    #define N  7
    
    void disp(void);
    
    int a[N]={5,0,7,1,9,11,12};
    
    /*排序函数*/
    void BubbleSort(void)  
    {  
           int i, j,temp;  
           for (i = 0; i < N-1; i++)             //比較N轮,每一轮比較出最大的那个数(大的数向右移)
    	   {
    		   
    		   printf("
    
    新一轮:        ");
    
                  for (j = 1; j < N - i; j++)   //每一轮比較的次数
    			  {
                         if (a[j - 1] > a[j])   //假设左面数比右面的数大,则交换位置(右移)
    					 {
    					      temp=a[j];
    						  a[j]=a[j-1];
    						  a[j-1]=temp;
    
    					 }
    					 disp();                //无论是否交换都进行打印,方便优化
    			  }   
    	   }	  
    }  
    
    /*输出函数*/
    void disp(void)
    {
         int i;
    
         printf("
    排序结果: 
    ");
    	 for(i=0;i<N;i++)
    	 {
    		printf("%d", a[i]);
    		printf("  ");
    	 }
    	
    }
    
    int main(void)
    {
    	BubbleSort();
    
    	return 0;
    
    }


    2.优化一

    /***************************************************************
    *版权全部 (C)2014,公司名称。

    * *文件名:冒泡排序法 *内容摘要:无 *其他说明:无 *当前版本号:V1.1 *作 者:若云流风 *完毕日期:2014.5.16 ***************************************************************/ #include <stdio.h> #define N 7 void disp(void); int a[N]={5,0,7,1,9,11,12}; /*排序函数*/ void BubbleSort2() { int j, k,temp; bool flag; k = N; flag = true; while (flag) //利用标志位推断是否进行下一轮 { flag = false; printf(" 新一轮: "); for (j = 1; j < k; j++) { if (a[j - 1] > a[j]) //在比較中引入标志位。假设这一轮有比較才会进行下一轮 { temp=a[j]; a[j]=a[j-1]; a[j-1]=temp; flag = true; } disp(); } k--; } } /*输出函数*/ void disp(void) { int i; printf(" 排序结果: "); for(i=0;i<N;i++) { printf("%d", a[i]); printf(" "); } } int main(void) { BubbleSort2(); // disp(); return 0; }



    3.优化二(终于)

    /***************************************************************
    *版权全部 (C)2014,公司名称。

    * *文件名:冒泡排序法 *内容摘要:无 *其他说明:无 *当前版本号:V1.2 *作 者:若云流风 *完毕日期:2014.5.16 ***************************************************************/ #include <stdio.h> #define N 7 void disp(void); int a[N]={5,0,7,1,9,11,12}; /*排序函数*/ //冒泡排序3 void BubbleSort3(void) { int j, k,temp; int flag; flag = N; while (flag > 0) //引入标志位 { k = flag; flag = 0; //清零标志位 printf(" 新一轮: "); for (j = 1; j < k; j++) { if (a[j - 1] > a[j]) //记录有比較时的标志,优化算法,降低空循环 { temp=a[j]; a[j]=a[j-1]; a[j-1]=temp; flag = j; } disp(); } } } /*输出函数*/ void disp(void) { int i; printf(" 排序结果: "); for(i=0;i<N;i++) { printf("%d", a[i]); printf(" "); } } int main(void) { BubbleSort3(); // disp(); return 0; }



    二.算法会说话

    int a[N]={5,0,7,1,9,11,12};

    1.经常使用程序

           这就是我们最经常使用的算法。数组要是N个数的话,要进行N-1轮,第i轮比較N-i次,假设左面的值比右面值大的话,进行位置互换。

    2.优化一

            我们增加标志位,假设上一轮值都没有变化的话,那么我们就直接退出了,避免了第3轮以后的空循环。


    3.优化二(终于)

              即使进行了优化一我们仍然能够看到第二轮和第三轮的空循环。尤其是第三轮。

    这次我们不但增加标志位,并且让标志位记录我们改变值时的位置,下次我们再循环就仅仅循环这个值之前的数就能够了。

             比如:本数组第一轮循环。最后一次赋值flag是在a[2]>a[3]  (7>1)的时候。flag被复制为3。之后就再也没被赋值了(也就是说之后的顺序都是正确的)所下面次,仅仅须要排前三个了。所下面一轮就仅仅有两个结果(消除多余的空循环)。


    參考:http://blog.csdn.net/morewindows/article/details/6657829

  • 相关阅读:
    lab anycast rp
    激光 & 激光器
    管道机器人结构设计及控制系统搭建
    自动开关灯装置
    基于MATLAB步态算法仿真的六足仿生机器人
    蓝牙AT模式
    语音识别LD3320
    蓝牙模块设置
    6红外遥控程序
    62、如何消除碎片文件
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5183624.html
Copyright © 2011-2022 走看看