算法相关_快排递归+随机数

题目要求

  • 给出一个无序数组,要求把数组分成数组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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值