zoukankan      html  css  js  c++  java
  • 归并排序

    #include <iostream>
    using namespace std;
    int tem[1005];
    int a[1005];
    bool com1(int x,int y)
    {
        return x >= y;
    }
    bool com2(int x ,int y)
    {
        return x <=y;
    }
    void merges(int from[] , int to[],int b ,int m, int e , bool com(int x,int y))
    {
        int i = b;
        int j = m+1;
        int k = b;
        while (i<=m&&j<=e)
        {
            if (com(from[i],from[j]))
                to[k++] = from[i++];
            else to[k++] = from[j++];
        }
        for (int t = i; t<=m;) to[k++] = from[t++];
        for (int t = j; t<=e;) to[k++] = from[t++];
        for (int t = b; t <= e ;t++)
            from[t] = to[t];
    }
    void mergesort(int a[], int b, int e,bool com(int x,int y))
    {
        if (b >= e ) return;
        int mid = (b+e)/2;
        mergesort(a,b,mid,com);
        mergesort(a,mid+1,e,com);
        merges(a,tem,b,mid,e,com);
    }
    void print(int a[],int n)
    {
        for (int i = 1; i<= n; i++)
        {
            cout << a[i] <<" ";
        }
        cout << endl;
    }
    int main()
    {
        int n;
        cin >> n;
        for (int i = 1 ; i<= n; i++)
            cin >> a[i];
        mergesort(a,1,n,com1);
        print(a,n);
        mergesort(a,1,n,com2);
        print(a,n);
    }
    递归数组慢
    #include <iostream>
    using namespace std;
    int tem[1005];
    int a[1005];
    bool com1(int x,int y)
    {
        return x >= y;
    }
    bool com2(int x ,int y)
    {
        return x <=y;
    }
    void merges(int from[] , int to[],int b ,int m, int e , bool com(int x,int y))
    {
        int i = b;
        int j = m+1;
        int k = b;
        while (i<=m&&j<=e)
        {
            if (com(from[i],from[j]))
                to[k++] = from[i++];
            else to[k++] = from[j++];
        }
        for (int t = i; t<=m;) to[k++] = from[t++];
        for (int t = j; t<=e;) to[k++] = from[t++];
    }
    //倍增法归并
    void mergesort(int a[], int b, int e,bool com(int x,int y))
    {
        int l = 1;
        int L = e-b+1; //长度
        while (l <= L)
        {
            int i;
            for (i = b; i+2*l-1 <= e; i+=2*l)
            {
                merges(a,tem,i,i+l-1,i+2*l-1,com);
            }
            merges(a,tem,i,min(i+l-1,e),e,com);
            l *= 2;
            // 循环数组
            for (i = b; i+2*l-1 <= e; i+=2*l)
            {
                merges(tem,a,i,i+l-1,i+2*l-1,com);
            }
            merges(tem,a,i,min(i+l-1,e),e,com);
            l *= 2;
        }
    }
    void print(int a[],int n)
    {
        for (int i = 1; i<= n; i++)
        {
            cout << a[i] <<" ";
        }
        cout << endl;
    }
    int main()
    {
        int n;
        cin >> n;
        for (int i = 1 ; i<= n; i++)
            cin >> a[i];
        mergesort(a,1,n,com1);
        print(a,n);
        mergesort(a,1,n,com2);
        print(a,n);
    }
    迭代倍增数组
     1 #include <iostream>
     2 using namespace std;
     3 bool com1(int x,int y)
     4 {
     5     return x >= y;
     6 }
     7 bool com2(int x ,int y)
     8 {
     9     return x <=y;
    10 }
    11 struct list_
    12 {
    13     int v;
    14     int next;
    15 }a[1005];
    16 int merge_list(list_ a[],int first ,int second ,bool com(int x ,int y),int n)
    17 {
    18     int new_head = n+1;
    19     int * ptr;
    20     while (first!=-1 && second != -1)
    21     {
    22         if (com(a[first].v,a[second].v))
    23             ptr = &first;
    24         else
    25             ptr = &second;
    26         a[new_head].next = (*ptr);
    27         new_head = (*ptr);
    28         (*ptr) = a[(*ptr)].next;
    29     }
    30     a[new_head].next = first + second + 1;
    31     return a[n+1].next;
    32 }
    33 int mergesort(list_ a[], int b, int e ,bool com(int x,int y),int n)
    34 {
    35     if (b == e) return b;
    36     if (b > e ) return -1;
    37     int mid = (e+b)/2;
    38     int first = mergesort(a,b,mid,com,n);
    39     int second = mergesort(a,mid+1,e,com,n);
    40     return merge_list(a,first,second,com,n);
    41 }
    42 void print(list_ a[],int n,int head)
    43 {
    44     for (int i = head; i != -1; i = a[i].next)
    45     {
    46         cout << a[i].v <<" ";
    47     }
    48     cout << endl;
    49 }
    50 void init(int n)
    51 {
    52     for (int i = 1; i<=n;i++)
    53         a[i].next = -1;
    54 }
    55 int main()
    56 {
    57     int n;
    58     cin >> n;
    59     for (int i = 1 ; i<= n; i++)
    60         cin >> a[i].v;
    61     init(n);
    62     int head = mergesort(a,1,n,com1,n);
    63     print(a,n,head);
    64     init(n);
    65     head = mergesort(a,1,n,com2,n);
    66     print(a,n,head);
    67 }
    递归链表快
  • 相关阅读:
    js node 节点 原生遍历 createNodeIterator
    nodejs fs copy本地文件src dst
    axios 请求常用组件,及其错误
    【IntelliJ IDEA学习之三】IntelliJ IDEA常用快捷键
    【IntelliJ IDEA学习之二】IntelliJ IDEA常用配置
    【IntelliJ IDEA学习之一】IntelliJ IDEA安装激活、VM参数
    【python学习案例】python判断自身是否正在运行
    【Linux脚本学习案例】shell脚本多通道并发执行存储过程
    【Activiti学习之四】Activiti API(三)
    【Activiti学习之三】Activiti API(二)
  • 原文地址:https://www.cnblogs.com/HITLJR/p/6226620.html
Copyright © 2011-2022 走看看