算法模板之排序
常见的排序算法有许多,主要分为\(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;
}