zoukankan      html  css  js  c++  java
  • 排序专题

    一些知识点:

    常见的 n^2 的排序算法有:冒泡排序,选择排序,交换排序

    常见的 nlogn 的排序算法有:归并排序(稳定排序),快速排序,堆排序,利用AVL 排序

    代码实现:

    冒泡排序(稳定排序):

    /****************************************
    * File Name: bubble_sort.cpp
    * Author: sky0917
    * Created Time: 2014年04月 2日 20:16:56
    ****************************************/
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    
    const int maxn = 1001;
    
    int a[maxn];
    int main(){
        int n;
        while (scanf("%d",&n)!=EOF){
            for (int i=0; i<n; i++){
                scanf("%d",&a[i]);
            }
            for (int i=0; i<n; i++){
                for (int j=0; j<n-1; j++){
                    if (a[j] > a[j+1]){
                        swap(a[j], a[j+1]);
                    }    
                }
            }
            for (int i=0; i<n; i++){
                printf("%d
    ",a[i]);
            }
        }
        return 0;
    }
    冒泡排序

    选择排序(不稳定排序):

    /****************************************
    * File Name: select_sort.cpp
    * Author: sky0917
    * Created Time: 2014年04月 2日 20:31:51
    ****************************************/
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    const int maxn = 1002;
    
    int a[maxn];
    int main(){
        int n; 
        while (scanf("%d",&n)!=EOF){
            for (int i=0; i<n; i++){
                scanf("%d",&a[i]);
            }
            
            for (int i=0; i<n; i++){
                int g = i;
                for (int j=i+1; j<n; j++){
                    if (a[j] < a[g]){
                        g = j;
                    }
                }
                swap(a[i], a[g]);
            }
            for (int i=0; i<n; i++){
                printf("%d
    ",a[i]);
            }
        }    
        return 0;
    }
    选择排序
    举个例子,序列5 8 5 2 9, 我们知道第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法

    归并排序(稳定排序):

    /****************************************
    * File Name: merge_sort.cpp
    * Author: sky0917
    * Created Time: 2014年04月24日 21:50:42
    ****************************************/
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    const int maxn = 100005;
    
    int a[maxn];
    int b[maxn];
    void merge_sort(int a[], int l, int r){
        if (l >= r)return;
        if (l + 1 == r){
            if (a[l] > a[r]) 
                swap(a[l], a[r]);
            return;
        }    
        int m = (l + r) / 2;
        merge_sort(a, l, m);
        merge_sort(a, m+1, r);
        int tl=l, tr = m+1;    
        int tp = 0;
        while (tl <= m && tr <= r){
            if (a[tl] <= a[tr])
                b[tp++] = a[tl++];
            else b[tp++] = a[tr++];    
        }    
        while (tl <= m)
            b[tp++] = a[tl++];
        while (tr <= r)
            b[tp++] = a[tr++];
        for (int i=0; i<tp; i++){
            a[l+i] = b[i];
        }
    }
    int main(){
        int n;
        while (scanf("%d",&n)!=EOF){
            for (int i=0; i<n; i++){
                scanf("%d",&a[i]);
            }
            merge_sort(a,  0, n-1);
            for (int i=0; i<n; i++)
                printf("%d%c",a[i],i==n-1?'
    ':' ');
        }    
        return 0;
    }

    快速排序(不稳定排序):

    /****************************************
    * File Name: quick_sort.cpp
    * Author: sky0917
    * Created Time: 2014年04月24日 20:17:44
    ****************************************/
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    const int maxn = 100005;
    
    int a[maxn];
    
    int getmid(int a[], int l, int r){
        int x = a[r];
        int mid = l;
        for (int i=l; i<r; i++){
            if (a[i] < x){
                swap(a[mid], a[i]);
                mid++;    
            }
        }
        swap(a[mid], a[r]);
        return mid;
    }
    
    void quick_sort(int a[], int l, int r){
        if (l >= r) return;
        int m = getmid(a, l, r);
            quick_sort(a, l, m-1);
            quick_sort(a, m+1, r);
    }
    int main(){
        int n;
        while (scanf("%d",&n)!=EOF){
            for (int i=1; i<=n; i++){
                scanf("%d",&a[i]);
            }
            quick_sort(a, 1, n);
            for (int i=1; i<=n; i++){
                printf("%d%c",a[i],i==n?'
    ':' ');
            }
        }    
        return 0;
    }

    堆排序(不稳定排序):

    /****************************************
    * File Name: heap_sort.cpp
    * Author: sky0917
    * Created Time: 2014年04月24日 20:04:35
    ****************************************/
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    const int maxn = 100005;
    
    int a[maxn];
    void down(int i, int n){
        for (int son; i <= n/2; i = son){
            son = i<<1;
            if ((son != n) && (a[son+1] > a[son]))
                son = son + 1;
            if (a[son] > a[i])
                swap(a[son], a[i]);
        }
    }
    void heap_sort(int a[], int n){
        for (int i=n/2; i>=1; i--){
            down(i, n);
        }
        for (int i=n; i>=1; i--){
            swap(a[1], a[i]);
            down(1, i-1);
        }
    }
    
    int main(){
        int n;
        while (scanf("%d",&n)!=EOF){
            for (int i=1; i<=n; i++){
                scanf("%d",&a[i]);
            }
            heap_sort(a, n);
            for (int i=1; i<=n; i++){
                printf("%d%c",a[i],i==n?'
    ':' ');
            }
        }    
        return 0;
    }

    基数排序(稳定排序): 时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的比较性排序法。

    /****************************************
    * File Name: bucket_sort.cpp
    * Author: sky0917
    * Created Time: 2014年04月24日 22:09:35
    ****************************************/
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int maxn = 100005;
    
    int a[maxn];
    int s[10][maxn];
    int tp[10];
    
    void bucket_sort(int a[], int n){
        memset(tp, 0, sizeof(tp));
        int k = 0, w = 1;
        int max_val = 1000000;
        while (w < max_val){
            for (int i=0; i<n; i++){
                int ls = (a[i] / w) % 10;
                s[ls][tp[ls]++] = a[i];    
            }
            for (int i=0; i<10; i++){
                if (tp[i]){
                    for (int j=0; j<tp[i]; j++){
                        a[k++] = s[i][j];
                    }
                    tp[i] = 0;
                }
            }
            k = 0, w *= 10;
        }
    }
    int main(){
        int n;
        while (scanf("%d",&n)!=EOF){
            for (int i=0; i<n; i++)
                scanf("%d",&a[i]);
            bucket_sort(a, n);
            for (int i=0; i<n; i++){
                printf("%d%c",a[i],i==n-1?'
    ':' ');
            }
        }
        return 0;
    }
  • 相关阅读:
    ByteBuffer的slice()方法
    Kafka多个消费者的小例子
    设计模式之迭代器模式
    设计模式之责任链模式
    @ComponentScan的scopeResolver属性详解
    ES中的文档更新
    ElasticSearch学习:安装
    强、软、弱、虚四大引用示例
    20个有用的小片段
    spring mvc 执行流程
  • 原文地址:https://www.cnblogs.com/sky0917/p/3641566.html
Copyright © 2011-2022 走看看