我是靠谱客的博主 炙热糖豆,最近开发中收集的这篇文章主要介绍算法相关_快排递归+随机数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目要求

  • 给出一个无序数组,要求把数组分成数组A1和数组A2,并满足两个数组元素个数差最小,元素和sum差最大

思想

  • 随机排序思想:以n/2为基准,用快速排序划分数组。

代码:

#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<iostream>
#include<algorithm>
using namespace std;

const int MAXN = 100010;
int A[MAXN],n;

//寻找n/2大的数字的位置,并根据这个位置把数组分成两半
//思想:随机选择一个数,一趟快排,然后递归

int randPartition(int A[],int left,int right)
//随机选择一个数字进行划分
{
    int P=(round(1.0*rand()/RAND_MAX*(right-left)+left));
    swap(A[P],A[left]);

    int temp=A[left];
    while(left<right)
    {
        while(left<right&&A[right]>temp)    right--;
        A[left]=A[right];
        while(left<right&&A[left]<temp)     left++;
        A[right]=A[left];
    }
    A[left]=temp;
    return left;
}

void randomSelect(int A[],int left,int right,int K)
//比较一趟快排和k的结果,递归
{
    if(left==right)     return;
    int p=randPartition(A,left,right);
    int M=p-left+1;
    if(M==K)    return;
    if(M<K)     return randomSelect(A,p+1,right,K);
    else     return randomSelect(A,left,p-1,K);
}

int main()
{
    srand((unsigned)time(NULL));    //初始化随机数字
    int sum=0,suml=0;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>A[i];
        sum+=A[i];
    }
    randomSelect(A,0,n-1,n/2);
    for(int i=0;i<n/2;i++)
        suml+=A[i];

    cout<<sum-suml-suml;

    return 0;
}

最后

以上就是炙热糖豆为你收集整理的算法相关_快排递归+随机数的全部内容,希望文章能够帮你解决算法相关_快排递归+随机数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部