排序(啊哈!算法)
一.桶排序
#include<iostream> using namespace std; int a[1001]; int b[10]; int main(){ int count=1; for(int i=0;i<10;i++){ cin>>b[i]; a[b[i]]+=1; } for(int i=1000;i>=0;i--){ if(a[i]){ for(int j=0;j<a[i];j++){ if(count!=10){ cout<<i<<' '; }else{ cout<<i<<endl; } count++; } } } return 0; //时间复杂度O(10+1000+10) //忽略较小的常数随意时间复杂度为O(1000) }
二.冒泡排序
N个数需要N-1趟,每趟比较N-i次(i是趟数)
#include<iostream> using namespace std; int a[10]; int main(){ int temp=0; for(int i=0;i<10;i++){ cin>>a[i]; } for(int i=0;i<10-1;i++){ for(int j=0;j<10-i;j++){ if(a[j]<a[j+1]){ temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } } for(int i=0;i<10;i++){ if(i!=9){ cout<<a[i]<<' '; }else{ cout<<a[i]<<endl; } } return 0; }
例子:
输出姓名成绩,按成绩进行排序,解决了桶排序遗留问题
#include<iostream> using namespace std; struct student{ char name[21]; int score; }; struct student a[100]; int n; int main(){ int temp=0; cin>>n; cout<<endl; for(int i=1;i<=n;i++){ cin>>a[i].name>>a[i].score; } for(int i=1;i<=n-1;i++){ for(int j=1;j<=n-i;j++){ if(a[j].score<a[j+1].score){ temp=a[j+1].score; a[j+1].score=a[j].score; a[j].score=temp; } } } cout<<endl; for(int i=1;i<=n;i++){ cout<<a[i].name<<':'<<a[i].score<<endl; } return 0; }
3.快速排序
#include<iostream> using namespace std; int a[100]; int n; void quicksort(int i,int j){ if(i>j){ return; } int temp=a[i]; int left=i; int right=j; while(i != j){ while(a[j]>=temp && i<j){ j--; } while(a[i]<=temp && i<j){ i++; } int k=a[i]; a[i]=a[j]; a[j]=k; } int k=a[left]; a[left]=a[i]; a[i]=k; quicksort(1,i-1); quicksort(i+1,right); } int main(){ cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } quicksort(1,n); for(int i=1;i<=n;i++){ if(i!=n){ cout<<a[i]<<' '; }else{ cout<<a[i]<<endl; } } return 0; }
例题:输入N个数,对其”去重“然后排序
#include<iostream> using namespace std; int a[100]; int n; void quicksort(int i,int j){ int temp=a[i]; int left=i; int right=j; if(i>j){ return; } while(i<j){ while(a[j]>=temp && i<j){ j--; } while(a[i]<=temp && i<j){ i++; } int k=a[i]; a[i]=a[j]; a[j]=k; } int k=a[left]; a[left]=a[i]; a[i]=k; quicksort(left,i-1); quicksort(i+1,right); } int main(){ cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } quicksort(1,n); for(int i=1;i<=n;i++){ if(a[i] != a[i-1]){ if(i!=n){ cout<<a[i]<<' '; }else{ cout<<a[i]<<endl; } } } return 0; }