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;
    }
  • 相关阅读:
    钱多多软件制作04
    团队项目01应用场景
    HDU 4411 arrest
    HDU 4406 GPA
    HDU 3315 My Brute
    HDU 3667 Transportation
    HDU 2676 Matrix
    欧拉回路三水题 POJ 1041 POJ 2230 POJ 1386
    SPOJ 371 BOXES
    POJ 3422 Kaka's Matrix Travels
  • 原文地址:https://www.cnblogs.com/elpsycongroo/p/9932860.html
Copyright © 2011-2022 走看看