• 算法模板之排序


    常见的排序算法有许多,主要分为(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;
    }
    
  • 相关阅读:
    献给即将27岁的我
    oracle导表小结
    [译]第三章:什么是组织结构
    第三章:什么是组织结构
    第二章:什么是组织
    [译]第二章:什么是组织
    第一章:什么是管理
    [译]第一章:什么是管理
    [原]DbHelper-SQL数据库访问助手
    DbHelper-SQL数据库访问助手
  • 原文地址:https://www.cnblogs.com/backkom-buaa/p/13855295.html
Copyright © 2020-2023  润新知