zoukankan      html  css  js  c++  java
  • 求两个有序数列的合并——分治算法

    用分治算法来求一个数组的排序

    分治算法:例如:将两个数组a[100]={2,4,5,7,1,2,,3,6}。这个数组排序

    先将这个数组分为均两部分得到{2,4,5,7},{1,2,3,6}。

    再将{2,4,5,7}分为两部分{2,4},{5,7}。

    再分为{2},{4}。

     这时一个数就不用排序了,直接输出自己。

    简单问题,就可以用二分或者三分来算。

    上代码:

    #include <bits/stdc++.h>
    using namespace std;
    void hebing(int a[],int b,int mid,int c)
    {int* k=new int [1000];
        int i=b,j=mid+1;
        int u=0;
        while(i<=mid&&j<=c)
        {
            if(a[i]<=a[j]) {k[u++]=a[i];i++;}
            else
            {
                k[u++]=a[j];
                j++;
            }
        }
        while(i<=mid){k[u++]=a[i];i++;}
        while(j<=c){k[u++]=a[j];j++;}
        for(int i=b,u=0;i<=c;i++,u++)
        {
            a[i]=k[u];
        } 
        delete[] k;
    }                                          // 这个hebing函数的具体代码。
    void paixu(int a[],int b,int c)  //b表示起始位置,c表示终止位置。
    {
        int mid;
        if(b>=c) return ;
        mid=(b+c)/2;
        paixu(a,b,mid);
        paixu(a,mid+1,c);    //构建两个排好序的数组(从起始到中间,从中间到终止)
        hebing(a,b,mid,c);   //将两个分别排好序的数组,整体排序,合二为一,组成一个我们想要的排好序的数组。
    }
    int main()
    {
        int n;
        int a[1000];
        cin>>n;
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
        }
        paixu(a,0,n-1);
        for(int i=0;i<n;i++)
        cout<<a[i]<<" ";
        return 0;
    
    }

     这个代码的运行时间要比sort函数用的时间短。

    成功不是偶然的,失败也不是必然的。
  • 相关阅读:
    P1456 Monkey King
    P3377 【模板】左偏树(可并堆)
    P1074 靶形数独
    P1120 小木棍
    P5490 【模板】扫描线
    糖糖别胡说,我真的不是签到题目
    最长公共子序列
    最长上升子序列
    数的三次方根
    地、颜色、魔法(dfs)
  • 原文地址:https://www.cnblogs.com/zhuyukun/p/12288352.html
Copyright © 2011-2022 走看看