• 求两个有序数列的合并——分治算法


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

    分治算法:例如:将两个数组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函数用的时间短。

    成功不是偶然的,失败也不是必然的。
  • 相关阅读:
    vue 中的单元测试
    redux-学习总结
    React-学习总结
    vuecli 中 chainWebpack 的常用操作
    常用 vue-config.js 配置
    JavaScript 中的 MVC、MVP、MVVM
    日常工作中 @vue/cli 需要关注的一些配置
    Electron 构建超时问题
    JSBridge 原理与封装
    Three.js 之相机
  • 原文地址:https://www.cnblogs.com/zhuyukun/p/12288352.html
Copyright © 2020-2023  润新知