
/* 2016年408真题:集合A划分为A1、A2,个数分别为n1、n2,和分别为S1、S2,|n1-n2|最小|S1-S2|最大 分析:|n1-n2|最小,意思就是平分撒;|S1-S2|最大,意思就是把最大的那部分值和最小的那部分值分开 我们可以采用排序的方法,排好序,当然快速排序时间复杂度最低, 然后一分为二,十分的直接明了 但是我们可以利用快速排序的特性,做一些优化:当我们进行一次快速排序后 若pivotPos==n/2,则已将最小、最大的n/2元素分开 若pivotPos < n/2,则对pivotPos后的元素继续划分 若pivotPos > n/2,则对pivotPos前的元素继续划分*/#include <stdio.h>//进行一次快速排序并返回枢纽位置int partition(int *arr, int low, int high) { int pivot = arr[low]; while (low < high) { while (low < high && arr[high] >= pivot)--high; arr[low] = arr[high]; while (low < high && arr[low] <= pivot)++low; arr[high] = arr[low]; } arr[low] = pivot; return low;}//快速排序void quickSort(int *arr, int low, int high, int mid) { if (low < high) { int pivotPos = partition(arr, low, high); if (pivotPos == mid)return ; if (pivotPos < mid) quickSort(arr, pivotPos + 1, high, mid); if (pivotPos > mid) quickSort(arr, low, pivotPos - 1, mid); }}int main() { int arr[] = { 1,5,6,3,4,7,11,10 }; quickSort(arr, 0, 7, 3); return 0;}