算法模板之排序

常见的排序算法有许多,主要分为\(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;
}
posted @ 2020-10-21 22:31  Aackkom  阅读(133)  评论(0编辑  收藏  举报