• 让算法会说话之冒泡排序


    转载请注明出处: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

  • 相关阅读:
    CentOS 压缩(打包)和解压
    CentOS 文件及目录等
    CentOS 文本操作命令(cat more less head tail tr wc state cut diff touch)
    CentOS 显示历史执行过的命令以及用户历史命令缓存文件
    CentOS 查看系统内核和版本
    CentOS 设置环境变量
    迅雷thunder://协议解密
    Office2016自定义安装
    Windows 10中设置自动登录
    Linux安装aMule下载eDonkey200网络共享文件
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10963482.html
Copyright © 2020-2023  润新知