zoukankan      html  css  js  c++  java
  • 八大排序算法总结

    快排:这里的形参为最大索引(面试一定会问)

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cstdlib>
    #include<iostream>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    #define maxn 10000
    int arr[maxn]={3,5,7,4,1};
    void quicksort(int a[],int l,int r){
        int i=l,j=r,tmp=a[l];
        if(l>=r) return;
        while(i!=j){
            while(j>i&&a[j]>tmp) j--;
            if(j>i) a[i]=a[j];
            while(i<j&&a[i]<tmp) i++;
            if(i<j) a[j]=a[i];
        }
        a[i]=tmp;
        quicksort(a,l,i-1);
        quicksort(a,i+1,r);
    }
    int main(){
        quicksort(arr,0,4);
        for(int i=0;i<5;i++){
            printf("%d ",arr[i]);
        }
        printf("
    ");
        return 0;
    }

     归并:这里的形参为最大索引

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cstdlib>
    #include<iostream>
    #include<cmath>
    #define maxn 10000
    using namespace std;
    typedef long long ll;
    int tmp[maxn],a[maxn];
    void merge(int l,int m,int r){
        int i=l,j=m+1,k=0;
        while(i<=m&&j<=r){
            if(a[i]<a[j]) tmp[k++]=a[i++];
            else tmp[k++]=a[j++];
        }
        while(i<=m) tmp[k++]=a[i++];
        while(j<=r) tmp[k++]=a[j++];
        for(int i=l;i<=r;i++) a[i]=tmp[i-l];
    }
    void mergesort(int l,int r){
        if(l<r){
            int mid=(l+r)>>1;
            mergesort(l,mid);
            mergesort(mid+1,r);
            merge(l,mid,r);
        }
    }
    int main(){
        int n;
        cin>>n;
        for(int i=0;i<n;i++) cin>>a[i];
        mergesort(0,n-1);
        for(int i=0;i<n;i++){
            printf("%d ",a[i]);
        }
        return 0;
    }

     堆排:这里的形参为size

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cstdlib>
    #include<cmath>
    #include<iostream>
    using namespace std;
    typedef long long ll;
    void adjustheap(int heap[],int i,int size){
        int j=2*i+1;
        while(j<size){
            if(j<size-1&&heap[j]<heap[j+1]) swap(heap[j],heap[j+1]);
            if(heap[i]>heap[j])break;
            swap(heap[i],heap[j]);
            i=j;
            j=2*i+1;
        }
    }
    void heapsort(int heap[],int size){
        for(int i=size/2-1;i>=0;i--){
            adjustheap(heap,i,size);
        }
        for(int i=size-1;i>0;i--){
            swap(heap[0],heap[i]);
            adjustheap(heap,0,i);
        }
    }
    int main(){
        int a[10]={1,5,3,4,2};
        heapsort(a,5);
        for(int i=0;i<5;i++){
            printf("%d ",a[i]);
        }
        return 0;
    }

     插入、选择、冒泡:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cstdlib>
    #include<iostream>
    #include<cmath>
    #define maxn 10000
    using namespace std;
    typedef long long ll;
    int arr[maxn]={1,3,2,5,4},n=5;
    //插入、选择、冒泡、  堆排、快排、归并、希尔
    void bubble_sort(){
        for(int i=0;i<n-1;i++){
            for(int j=0;j<n-1-i;j++){
                if(arr[j]>arr[j+1])swap(arr[j+1],arr[j]);
            }
        }
    }
    void select_sort(){
        for(int i=0;i<n;i++){
            for(int j=i+1;j<n;j++){
                if(arr[j]<arr[i]) swap(arr[i],arr[j]);
            }
        }
    }
    void insert_sort(){
        for(int i=1;i<n;i++){
            for(int j=0;j<i;j++){
                if(arr[i]<arr[j]) swap(arr[i],arr[j]);
            }
        }
    }
    int main(){
        //bubble_sort();
        //select_sort();
        insert_sort();
        for(int i=0;i<n;i++){
            printf("%d ",arr[i]);
        }
        printf("
    ");
        return 0;
    }

     希尔排序:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cstdlib>
    #include<iostream>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    int arr[10] = {9,1,5,8,3,7,6,0,2,4};
    
    void shellsort(int a[],int len){
        for(int gap=len/2;gap>0;gap/=2){
            for(int i=gap;i<len;i++){
                int j=i;
                while(j-gap>=0&&a[j]<a[j-gap]) swap(a[j],a[j-gap]),j-=gap;
            }
        }
    }
    
    int main(){
        shellsort(arr,10);
        for(int i=0;i<10;i++){
            printf("%d ",arr[i]);
        }
        printf("
    ");
        return 0;
    }

     基数排序:

    #include<cstdio>
    #include<cstdlib>
    #include<iostream>
    #include<cmath>
    #define inf 0x3f3f3f3f
    using namespace std;
    typedef long long ll;
    int a[]={5,2,3,1,4};
    void tmpsort(int a[],int n,int exp){
        int cnt[10]={0},output[n];
        for(int i=0;i<n;i++) cnt[a[i]/exp%10]++;
        for(int i=1;i<10;i++) cnt[i]+=cnt[i-1];
        for(int i=n-1;i>=0;i--) output[cnt[a[i]/exp%10]-1]=a[i],cnt[a[i]/exp%10]--;
        for(int i=0;i<n;i++) a[i]=output[i];
    }
    void radixsort(int a[],int n){
        int maxx=-inf;
        for(int i=0;i<n;i++) maxx=max(maxx,a[i]);
        for(int i=1;maxx/i>0;i*=10) tmpsort(a,n,i);
    }
    int main(){
        radixsort(a,5);
        for(int i=0;i<5;i++){
            printf("%d ",a[i]);
        }
        return 0;
    }
  • 相关阅读:
    excel unixtime与北京时间互转
    vim的漫漫长征路
    const常量
    第一章:绪论
    2.4奇偶校验
    2.3数据校验的基本原理
    2.2定点与浮点数据表示
    2.1机器数及其特点
    1.2计算机系统性能评价
    冯诺依曼结构原理及层次分析
  • 原文地址:https://www.cnblogs.com/elpsycongroo/p/9932860.html
Copyright © 2011-2022 走看看