解决冒泡排序中的先后顺序问题
说明
冒泡排序是我们经常用到的排序方式;但是也有一个致命缺点:就是排序时是将一个数与它后面的每一个数进行比较当两个数相等时,如果被比较的那个数后面有比他小的数,那么他前面的那个比较数就会和他后面的数交换位置,但是一些题目要求当两个数相等时,按先后顺序排序,那这个时候冒泡就不行了。比如一组数:13(a) 9 16 11(a) 13(b) 11(b)
我们要得到:9 11(a) 11(b) 13(a) 13(b) 16 ;而冒泡排序只能得到:9 11(a) 11(b) 13(b) 13(a) 16 这个时候就要改算法了。
沉底排序
说明:这个排序是两个数两个数比较的排序
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,i,x,j,flag=1;
cin>>n;
int a[n];
for(i=0;i<n;i++)
cin>>a[i];
for(j=0;j<n-1&&flag;j++){
flag=0;
for(i=0;i<n-1-j;i++)
if(a[i]>a[i+1]){
x=a[i];a[i]=a[i+1];a[i+1]=x;
flag=1;
}
}
for(i=0;i<n;i++)
cout<<a[i]<<" ";
return 0;
}
变化过程:
始:13(a) 9 16 11(a) 13(b) 11(b)
9 13(a)16 11(a) 13(b) 11(b)
9 13(a) 11(a) 16 13(b) 11(b)
9 13(a) 11(a) 13(b) 16 11(b)
9 13(a) 11(a) 13(b) 11(b) 16
9 11(a) 13(a) 13(b) 11(b) 16
9 11(a) 13(a) 11(b) 13(b) 16
9 11(a) 11(b) 13(a) 13(b) 16