冒泡排序
注:最少排序1趟,比较n-1次;最多排序n-1趟,比较n(n-1)/2次。
#include<iostream>
#include<stdio.h> using namespace std; int n,a[10005]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<n;i++) for(int j=1;j<=n-i;j++) if(a[j]>a[j+1]) swap(a[j],a[j+1]); for(int i=1;i<=n;i++) printf("%d ",a[i]); return 0; }
选择排序
注:排序n-1趟,比较n(n-1)次。
#include<iostream>
#include<stdio.h> using namespace std; int n,a[10005]; int main() { scanf("%d",&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]) swap(a[i],a[j]); for(int i=1;i<=n;i++) printf("%d ",a[i]); return 0; }
插入排序
注:最少比较n-1次,最多比较n(n-1)次。
对于m个有序的序列,二分查找最坏情况下比较次数为1+log(m),在二分插入排序中,元素比较次数为(n-1)+log(1*2*...*(n-1))
#include<iostream> #include<stdio.h> using namespace std; int n,temp,a[10000005]; void Sort() { int i,j,k; for(i=0;i<n;i++) { for(j=i-1;j>=0;j--) if(a[j]<a[i]) break; if(j!=i-1) { temp=a[i]; for(k=i-1;k>j;k--) a[k+1]=a[k]; a[k+1]=temp; } } } int main() { cin>>n; for(int i=0;i<n;i++) scanf("%d",&a[i]); Sort(); for(int i=0;i<n;i++) printf("%d ",a[i]); return 0; }
桶排序
#include<iostream> #include<stdio.h> using namespace std; int n,k,num[10000005]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&k),num[k]++; for(int i=0;i<=10000005;i++) for(int j=num[i];j>=1;j--) printf("%d ",i); return 0; }
快速排序
#include<iostream> #include<stdio.h> using namespace std; int n,a[10000005]; void Sort(int left,int right) { int i,j,temp,tp; temp=a[left],i=left,j=right; if(left>right) return; while(i!=j) { while(a[j]>=temp && i<j) j--; while(a[i]<=temp && i<j) i++; if(i<j) swap(a[i],a[j]); } a[left]=a[i],a[i]=temp; Sort(left,i-1); Sort(i+1,right); return; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); Sort(1,n); for(int i=1;i<=n;i++) printf("%d ",a[i]); return 0; }
STL快速排序
#include<iostream> #include<stdio.h> #include<algorithm> using namespace std; int n,a[10000005]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+1+n,greater<int>()); //倒序 for(int i=1;i<=n;i++) printf("%d ",a[i]); return 0; }
堆排序
注:比较次数较稳定的靠近nlogn
#include<iostream> #include<stdio.h> using namespace std; void adjustheap(int *arr,int i,int len) { int j=i*2+1; while(j<len) { if(j+1<len && arr[j]<arr[j+1]) j++; if(arr[i]>arr[j]) break; swap(arr[i],arr[j]); i=j,j=2*i+1; } } void makeheap(int *arr,int n) { int i; for(i=n/2-1;i>=0;i--) adjustheap(arr,i,n); } void heapsort(int *arr,int len) { makeheap(arr,len); for(int i=len-1;i>=0;i--) { swap(arr[i],arr[0]); adjustheap(arr,0,i); } } int main() { int n,a[10005]; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&a[i]); heapsort(a, n); for(int i=0;i<n;i++) printf("%d ",a[i]); return 0; }
STL堆排序
#include<iostream> #include<stdio.h> #include<queue> using namespace std; //priority_queue<int,vector<int>,less<int> > q; //priority_queue<int,vector<int>,greater<int> >q; priority_queue<int> q; int n,x; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&x),q.push(x); for(int i=1;i<=n;i++) printf("%d ",q.top()),q.pop(); return 0; }
归并排序
注:最少比较nlog2(n)/2次,最多比较nlog2(n)-n+1次。
#include<iostream> #include<stdio.h> using namespace std; int n,a[100005],temp[100005]; void Sort(int l,int r) { if(l==r) return; int mid=(l+r)>>1; Sort(l,mid); Sort(mid+1,r); int i=l,j=mid+1,k=l; while(i<=mid && j<=r) if(a[i]<=a[j]) temp[k]=a[i],k++,i++; else temp[k]=a[j],k++,j++; while(i<=mid) temp[k]=a[i],k++,i++; while(j<=r) temp[k]=a[j],k++,j++; for(int i=l;i<=r;++i) a[i]=temp[i]; return; } int main() { scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d",&a[i]); Sort(1,n); for(int i=1;i<=n;++i) printf("%d ",a[i]); return 0; }
计数排序
#include<iostream> #include<stdio.h> using namespace std; const int maxn=1e6+5; int n,maxx,a[maxn],b[maxn],rec[maxn],sum[maxn]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]),sum[a[i]]++,maxx=max(maxx,a[i]); for(int i=1;i<=maxx;i++) sum[i]+=sum[i-1]; for(int i=1;i<=n;i++) rec[i]=sum[a[i]]--; for(int i=1;i<=n;i++) b[rec[i]]=a[i]; for(int i=1;i<=n;i++) printf("%d ",b[i]); return 0; }
希尔排序
#include<iostream> #include<stdio.h> using namespace std; void shell_sort(int a[],int size) { if(a==NULL) return; int h=1; while(h<size/3) h=3*h+1; while(h>=1) { for(int i=h;i<size;i++) for(int j=i;j>=h && (a[j]<a[j-h]);j-=h) swap(a[j],a[j-h]); h=h/3; } } int main() { int n; scanf("%d",&n); int *a=new int(n); for(int i=0;i<n;i++) scanf("%d",&a[i]); shell_sort(a,n); for(int i=0;i<n;i++) printf("%d ", a[i]); return 0; }