zoukankan      html  css  js  c++  java
  • 排序之冒泡排序算法

    冒泡排序

    冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有元素再需要交换,也就是说该数列已经排序完成。
    这个算法的名字由来是因为越小的元素会经由交换像气泡一样慢慢“浮”到数列的顶端。

    冒泡排序规则
    1.每次比较相邻的元素,如果第一个比第二个大,就交换他们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。经过一轮排序后,最后的元素应该会是最大的数。
    2.针对所有的元素重复以上的步骤,除了最后一个。
    3.持续每轮对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较,也就是已经是按照从小到大的顺序排列了。

    #include<iostream>
    using namespace std;
    int main()
    {
        int n,tmp;
        int a[200];
        cin>>n;
        for(int i=1;i<=n;i++)
            cin>>a[i];
        for(int i=1;i<=n-1;i++)      //比较多少轮 
            for(int j=1;j<=n-i;j++) {  //每轮比较多少次
                if(a[j]>a[j+1]) {     //相邻的两个数作比较
                    tmp=a[j];
                    a[j]=a[j+1];
                    a[j+1]=tmp;
                }
            }
        for(int i=1;i<=n;i++)
            cout<<a[i]<<" ";
        return 0;
     } 
    

    例题:
    第k小的数
    给定一个长度为 n ( 1 <= n <= 10000 ) 的序列,问该序列中第 k ( 1 <= w <= n ) 小的元素是多少?
    【输入描述】第一行:两个整数 n和 k。接下来一行 n 个数,表示这个序列。
    【输出描述】输出仅一行,表示第k小的元素。
    【样例输入】5 3
    18 23 4 5 12
    【样例输出】12

    参考代码

    #include <iostream>
    using namespace std;
    int s[10001];
    int main()
    {
    	int n,k;
    	cin >> n >>k;
    	for(int i=1;i<=n;i++)
    		cin >> s[i];
    	for(int i=1;i<=n-1;i++)
    	{
    		for(int j=1;j<=n-i;j++)
    		{
    			if(s[j]>s[j+1])
    			{
    				int t;
    				t = s[j];
    				s[j] = s[j+1];
    				s[j+1] = t;
    			}
    		}
    	}
    	cout << s[k];
    	return 0;
    }
    

    冒泡排序优化
    刚才对于序列{12,35,99,18,76}的排序过程中,我们不难发现,第二轮排序进行完之后,整个序列已经是有序的了,也就是说第二轮排序结束就可以不用接着进行接下来的比较了。
    因此我们可以对刚才的程序进行优化,那么什么时候就可以结束排序过程呢?根据观察,我们发现当某轮排序过程中没有交换的发生,那么就说明序列已经有序,无需再次比较了。

    优化代码

    #include<iostream>
    using namespace std;
    int main()
    {
           int n,flag=1; //flag标记是否有交换 
           int a[200];
           cin>>n; 
           for(int i=1;i<=n;i++)
                  cin>>a[i];
           for(int i=1;i<=n-1;i++)  
           {
                  if(flag==0)  //没有交换直接结束排序 
            	  	break;
                  flag=0;  //每轮比较均初始化flag     
                  for(int j=1;j<=n-i;j++) 
                  {
                    if(a[j]>a[j+1])
                    {
                     flag=1;  //有交换发生则标记为1 
                     int t=a[j];
                     a[j]=a[j+1];
                     a[j+1]=t;
                     }
                  }
              }
          for(int i=1;i<=n;i++) cout<<a[i]<<" ";
          return 0;
    } 
    
    我是bigbigli!!! 更多内容请关注微信公众号:“大李日志”
  • 相关阅读:
    [C语言]变长函数参数和变长参数宏
    [转载]腾讯机智团队分享--AllReduce算法的前世今生
    (三)opencv_py之阈值处理
    (二)opencv_py之彩色空间转换
    neo4j 一些常用的CQL
    Neo4j (1)创建节点
    tensorflow实现siamese网络 (附代码)
    早停!? earlystopping for keras
    关于 ESIM 网络的 资料 集合
    聊天机器人资源合集:项目,语聊,论文,教程
  • 原文地址:https://www.cnblogs.com/bigbigli/p/13265745.html
Copyright © 2011-2022 走看看