万恶我快排
快排是在普通排序的基础上利用二分优化加快速度
#include<bits/stdc++.h>
using namespace std;
const int maxn=100000+5;
int a[maxn];
int n;
int main(){
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
if(a[i]<a[j]){
int k=a[i];a[i]=a[j];a[j]=k;
}
for(int i=1;i<=n;i++)
printf("%d%c",a[i],i==n?'\n':' ');
return 0;
}
这是普通排序,从大到小,算法时间复杂度是O(n*n)
接下来一个桶排序标记一下有几个,然后输出几次
#include<bits/stdc++.h>
using namespace std;
int flag[10005];
int n;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
int tmp;
scanf("%d",&tmp);
flag[tmp]++;
}
for(int i=0;i<=10000;i++)
while(flag[i]>0){
printf("%d ",i);
flag[i]--;
}
return 0;
}
快排手打是定义一个自函数,递归
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000+5;
int a[maxn];
int n;
void qsort(int l,int r){
int i,j,x,y;
i=l;
j=r;
x=a[(r+1)/2];
do{
while(a[i]<x)i++;
while(x<a[j])j--;
if(i==j){
y=a[i];
a[i]=a[j];
a[j]=y;
i++;
j--;
}
}while(i<=j);
if(l<j)qsort(l,j);
if(i<r)qsort(i,r);
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
qsort(1,n);
for(int i=1;i<=n;i++)
printf("%d%c",a[i],i==n?'\n':' ');
return 0;
}
上面的代码千万别用,莫名其妙地错了
最后,送个好东西,快排模板,可以排整数型,实数型,浮点型,字符型,字符串,结构体排序(默认从小到大排序)
快排模板可以在万能头文件,也就是#include<bits/std++.h>中调用
也可以用#include< algorithm >调用
#include<bits/stdc++.h>
using namespace std;
const int maxn=10000+5;
int a[maxn];
int n;
int main(){
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+1+n); //默认从小到大排序
for(int i=1;i<=n;i++)
printf("%d%c",a[i],i==n?'\n':' ');
return 0;
}
要改成从大到小就加一个自函数
#include<bits/stdc++.h>
using namespace std;
const int maxn=10000+5;
int a[maxn];
int n;
int cmp(int a,int b){
return a>b;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+1+n,cmp); //在后面加上运用的自函数的名称
for(int i=1;i<=n;i++)
printf("%d%c",a[i],i==n?'\n':' ');
return 0;
}
再打一下结构体的吧,其实差别不大
#include<bits/stdc++.h>
using namespace std;
const int maxn=10000+5;
struct node{
int x;
}a[maxn];
int n;
int cmp(node u,node v){ //按成员x从大到小排序
return u.x>v.x;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d",&a[i].x);
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++)
printf("%d%c",a[i],i==n?'\n':' ');
return 0;
}
其它的懒得说了,自己改一下就好了