常見的排序算法有許多,主要分爲\(O(n^2)\)和\(O(nlog(n))\)算法
void pop_sort(){ memcpy(b,a,sizeof(a)); cout<<"冒泡排序: "<<endl; for(int i=0;i<n-1;i++) for(int j=0;j+1<n-i;j++) { if(b[j]<b[j+1]) continue; else swap(b[j],b[j+1]); } for(int i=0;i<n;i++) cout <<b[i] <<" "; cout<<endl; }
void select_sort(){ memcpy(b,a,sizeof(a)); cout<<"選擇排序:"<<endl; for(int i=0;i<n-1;i++){ int& mi=b[i]; for(int j=i+1;j<n;j++){ if(b[j]<mi) swap(mi,b[j]); } } for(int i=0;i<n;i++) cout <<b[i] <<" "; cout<<endl; }
void insert_sort() { cout<<"插入排序:"<<endl; memcpy(b,a,sizeof(a)); for(int i=0;i<n-1;i++){ for(int j=i+1;j-1>=0;j--) { if(b[j]<b[j-1]) swap(b[j],b[j-1]); else break; } } for(int i=0;i<n;i++) cout <<b[i] <<" "; cout<<endl; }
void qk_sort(int l,int r) { int mid = b[l+(r-l)/2],i=l,j=r; while(i<=j) { while (b[i]<mid) i++; while (b[j]>mid) j--; if(i<=j) { swap(b[i],b[j]); i++,j--; } } if(i<r) qk_sort(i,r); if(j>l) qk_sort(l,j); return ; }
void merge(int l,int mid,int r) { int i=l,j=mid+1,k=l; while(i<=mid&&j<=r) { if(b[i]<=b[j])p[k++]=b[i++]; else p[k++]=b[j++]; } while(j<=r) p[k++]=b[j++]; while(i<=mid)p[k++]=b[i++]; for(int i=l;i<=r;i++) b[i]=p[i]; } void merge_sort(int l,int r){ if(l<r) { int mid=(l+r)/2; merge_sort(l,mid); merge_sort(mid+1,r); merge(l,mid,r); } }
int hp[100],cnt; void push(int i){ hp[++cnt]=i; int k=cnt,f=k/2; while(f>=1){ if(hp[f]>hp[k]){ swap(hp[f],hp[k]); k=f; f=k/2; } else break; } } int pop() { int ret=hp[1]; swap(hp[1],hp[cnt--]); int k=1,t; while(k*2<=cnt){ if(k*2+1<=cnt&&hp[k*2+1]<hp[k*2]) t=k*2+1; else t=k*2; if(hp[k]>hp[t]){ swap(hp[k],hp[t]); k=t; } else break; } return ret; }