bigbigli_大大李

排序之冒泡排序算法

冒泡排序

冒泡排序(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;
} 
posted @ 2020-07-08 11:06  bigbigli  阅读(252)  评论(0编辑  收藏  举报