排序算法,就目前统计而言,有直接选择排序,直接插入排序,希尔排序,堆排序,冒泡排序,快速排序,归并排序,基数排序,计数排序,桶排序,随机快速排序,名次排序共 12种。
这几种排序之中,是可以分类。基数排序,计数排序,桶排序都是非比较性的排序方法,而其它的所有算法都是基于比较的。部分算法的时间空间的复杂度如下:
冒泡排序
#include<cstdio>
int num[32768];
int tot;
int main(){
scanf("%d",&tot);
for(int i=1;i<=tot;i++){
scanf("%d",&num[i]);
}
for(int i=1;i<=tot;i++){
for(int j=1;j<=tot-i;j++){
if(num[j+1]>num[j]){
int t=num[j+1];
num[j+1]=num[j];
num[j]=t;
}
}
}
for(int i=1;i<=tot;i++){
printf("%d ",num[i]);
}
return 0;
}
选择排序
#include<cstdio>
int num[32768];
int tot;
int main(){
scanf("%d",&tot);
for(int i=1;i<=tot;i++){
scanf("%d",&num[i]);
}
for(int i=1;i<=tot;i++){
int k=i;
for(int j=i+1;j<=tot;j++){
if(num[j]>num[k]){
k=j;
}
}
if(k!=i){
int t=num[k];
num[k]=num[i];
num[i]=t;
}
}
for(int i=1;i<=tot;i++){
printf("%d ",num[i]);
}
return 0;
}
插入排序
#include<cstdio>
int num[32768];
int tot;
int main(){
scanf("%d",&tot);
for(int i=1;i<=tot;i++){
scanf("%d",&num[i]);
}
for(int i=2;i<=tot;i++){
int j=i-1;
while(j>0 && num[i]>num[j]){
j--;
}
if(j!=i-1){
int t=num[i];
for(int x=i-1;x>j;x--){
num[x+1]=num[x];
}
num[j+1]=t;
}
}
for(int i=1;i<=tot;i++){
printf("%d ",num[i]);
}
return 0;
}
计数排序
#include<cstdio>
#include<cstring>
int fuel[100000];
int tot,x;
int min=0x7f7f7f;
int max=-0x7f7f7f;
int main(){
memset(fuel,0,sizeof(fuel));
scanf("%d",&tot);
for(int i=1;i<=tot;i++){
scanf("%d",&x);
fuel[x]++;
if(x>max)max=x;
if(x<min)min=x;
}
for(int i=max;i>=min;i--){
while(fuel[i]!=0){
printf("%d ",i);
fuel[i]--;
}
}
return 0;
}
归并排序
#include<iostream>
using namespace std;
int num[32768];
int s[32768];
void msort(int l,int r){
if(l==r)
return;
int mid=(l+r)/2;
msort(l,mid);
msort(mid+1,r);
int ll=l,rr=mid+1,k=l;
while(ll<=mid && rr<=r){
if(num[ll]>=num[rr]){
s[k]=num[ll];
k++;
ll++;
}
else{
s[k]=num[rr];
k++;
rr++;
}
}
while(ll<=mid){
s[k]=num[ll];
ll++;
k++;
}
while(rr<=r){
s[k]=num[rr];
rr++;
k++;
}
for(int i=l;i<=r;i++)
num[i]=s[i];
}
int main(){
int tot;
cin>>tot;
for(int i=1;i<=tot;i++){
cin>>num[i];
}
msort(1,tot);
for(int i=1;i<=tot;i++){
cout<<num[i]<<endl;
}
return 0;
}
快速排序
最常见的就是快速排序,就平均的排序时间而言,快速排序是表现情况最好的。它本质上是冒泡算法的一种改进,本身也有几个版本
#include<cstdio>
#include<iostream>
using namespace std;
int num[32768];
void qsort(int l,int r){
int mid=num[(l+r)/2];
int ll=l;
int rr=r;
while(ll<=rr){
while(num[ll]>mid){
ll++;
}
while(num[rr]<mid){
rr--;
}
if(ll<=rr){
int t=num[ll];
num[ll]=num[rr];
num[rr]=t;
ll++;
rr--;
}
}
if(l<rr)
qsort(l,rr);
if(ll<r)
qsort(ll,r);
}
int main(){
int tot;
cin>>tot;
for(int i=1;i<=tot;i++){
cin>>num[i];
}
qsort(1,tot);
for(int i=1;i<=tot;i++){
cout<<num[i]<<endl;
}
return 0;
}
C++各种排序进阶https://blog.csdn.net/way_back/article/details/122775292