冒泡排序
冒泡排序(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;
}