题目
设S是n(n为偶数)个不等的正整数的集合,要求将集合S划分为子集S1和S2,使得|S1|=|S2|=n/2,且两个子集元素之和的差达到最大。
分析
最容易想到的做法是先进性快速排序,则前半个数组即为S1,后半个数组即为S2,然而快排的时间复杂度为O(nlgn),而此题无需把每个元素都排好序,因此时间性能可进一步提高。此题出现在分治法的章节,因此有:利用快速排序的划分思想,设正整数集合为数组S,划分为前半个数组S1,后半个数组为S2,若第一次划分的轴值是中位数,则返回;若不是继续划分中位数所在的部分。
c++实现
/*
程序:偶数大小的不等正整数集合划分为两个相同大小的子集,使两子集元素之和的差达到最大。
作者:Moyu
*/
#include<iostream>
#include<vector>
using namespace std;
/*
函数:快速排序一次划分
*/
int Partition(vector<int> &v, int lo, int hi)
{
int pivot = v[lo];
while(lo < hi)
{
while(lo < hi && v[hi] >= pivot)
--hi;
v[lo] = v[hi];
while(lo < hi && v[lo] <= pivot)
++lo;
v[hi] = v[lo];
}
v[lo] = pivot;
return lo;
}
/*
函数:偶数大小数组分割ÿ