104.png

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