排序—冒泡、插入、桶、快速、归并
冒泡排序
#include<bits/stdc++.h>
using namespace std;
int a[]={1,28,22,3,12,3,3,232,23,4,5};
void printArr(int *a,int length){
for(int i=0;i<length;i++)
cout<<a[i]<<" ";
}
int main(){
bool flag = false;
//冒泡排序外层length次,内层length-外层次数
//每次对比前后一个数的大小,并把较大的数供到后面
//如果本轮没有拱数据说明数组以及有序结束查找
int length = sizeof(a)/4;
for(int i=length-1;i>0;i--){
flag = true;
for(int j=0;j<i;j++){
if(a[j]>a[j+1]){
swap(a[j],a[j+1]);
flag = false;
}
}
if(flag)
break;
}
printArr(a,length);
return 0;
}
应用习题:
车厢重组
在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转。一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转180度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排列车厢的顺序。于是他就负责用这座桥将进站的车厢按车厢号从小到大排列。他退休后,火车站决定将这一工作自动化,其中一项重要的工作是编一个程序,输入初始的车厢顺序,计算最少用多少步就能将车厢排序。
输入
输入文件有两行数据,第一行是车厢总数N(不大于10000),第二行是N个不同的数表示初始的车厢顺序。
输出
一个数据,是最少的旋转次数。
输入样例
4
4 3 2 1
输出样例
6
做题链接:
https://www.luogu.org/problemnew/show/P1116
欧阳的解
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,count=0;
bool flag = true;
cin>>n;
int a[n];
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=n-1;i>0;i--){
flag = true;
for(int j=0;j<i;j++){
if(a[j]>a[j+1]){
swap(a[j],a[j+1]);
flag = false;
count++;
}
}
if(flag)
break;
}
cout<<count;
return 0;
}
插入排序
#include<bits/stdc++.h>
using namespace std;
int main(){
//得到数组
int n;
cin>>n;
int a[n];
for(int i=0;i<n;i++)
cin>>a[i];
//循环遍历插入
for(int i=1;i<n;i++)
for(int j=i;j>0;j--){
if(!(a[j]<a[j-1]))
//j->i-1每个元素向后移动一个位置
break;
swap(a[j-1],a[j]);
}
//输出
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
return 0;
}
彭星霖的方法
#include<bits/stdc++.h>
using namespace std;
int main() {
int a[]= {5,4,1,3};
for(int i=1; i<4; i++)
if(a[i]<a[i-1]) {
swap(a[i],a[i-1]);
i=0;
}
for(int i=0; i<4; i++)
cout<<a[i];
return 0;
}
桶排序
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[] = {6,4,3,6,4,3,6,4,3,6,4,3};
int k[101];
memset(k,0,sizeof(k));
int n=sizeof(a)/4;
for(int i=0;i<n;i++)
k[a[i]]++;
for(int i=0;i<101;i++){
while(k[i]-->0)
cout<<i<<" ";
}
return 0;
}
快速排序
#include<bits/stdc++.h>
using namespace std;
void mysort(int *a,int l,int r){
if(l>=r)
return;
int base = a[l],i=l,j=r;
while(i<j){
while(j>i&&a[j]>=base) j--;
while(i<j&&a[i]<=base) i++;
swap(a[i],a[j]);
}
swap(a[l],a[i]);
for(int i=0;i<8;i++)
cout<<a[i]<<" ";
cout<<i<<"::"<<j<<endl;
mysort(a,l,i);
mysort(a,i+1,r);
}
int main(){
int a[] = {6,4,3,1,36,6,73,3};
int n = sizeof(a)/4;
mysort(a,0,n-1);//对left左右进行划分的函数,使得划分之后左边大于bse,右边小于base
cout<<"result:";
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
return 0;
}
归并排序
#include<bits/stdc++.h>
using namespace std;
void mysort(int *r,int *a,int s,int e){
if(s>=e)
return;
int mid = (e+s)/2;
cout<<"mid:"<<mid<<endl;
mysort(r,a,s,mid);
mysort(r,a,mid+1,e);
int i=s,j=mid+1,k=s;
while(i<=mid&&j<=e){
if(a[i]<a[j])
r[k++]=a[i++];
else
r[k++]=a[j++];
cout<<"k="<<k-1<<";r[k]="<<r[k-1]<<endl;
}
while(i<=mid)
r[k++]=a[i++];
while(j<=e)
r[k++]=a[j++];
for(int i=s;i<=e;i++)
a[i]=r[i];
}
int main(){
int a[] = {6,4,3,6,4,3,6,4,3,6,4,3};
int n = sizeof(a)/4;
int r[n];
mysort(r,a,0,n-1);//对s到e个元素进行分解后归并
for(int i=0;i<n;i++)
cout<<r[i]<<" ";
return 0;
}