//快速排序算法
//partition 分割算法
//第一种是选取区间的第一个元素作为pivot
int partition_first(Elemtype A[], int low, int high){
Elemtype pivot = A[low];
while(low < high){
while(low < high && A[high] >= pivot) --high;
A[low] = A[high];
while(low < high && A[low] <= pivot) ++low;
A[high] = A[low];
}
A[low] = pivot;
return low;
}
//第二种是随机选取区间的任意一个元素作为pivot
int partition_random(Elemtype A[], int low, int high){
int random_index = random()%(high - low + 1);
swap(A[low], A[random_index]);
Elemtype pivot = A[low];
int i = low;
for(int j = low + 1;j <= high; ++j)
if(A[j] < pivot)
swap(A[++i], A[j])
swap(A[i], A[low]);
return i;
}
//快速排序
void quicksort(Elemtype A[], int low, int high){
if(low >= high) return;
int i = partition_first(A, low, high);
quicksort(A, low, i - 1);
quicksort(A, i + 1, high);
}
//找出序列中第k小的数
int find_k(Elemtype A[], int low, int high, int k){
int i = partition_first(A, low, high);
if(i == k) return A[i];
if(i > k) return find_k(A, low, i - 1, k);
if(i < k) return find_k(A, i + 1, high, k - i);
}
/*将由n个正整数构成的集合A划分成两个不相交的子集A1和A2,元素个数分别为n1和n2,
A1和A2中的元素和分别是S1和S2。要求|n1-n2|最小且|S1-S2|最大
*/
void setPatition(int A[], int n){
int low = 0, high = n - 1;
int low0 = 0, high0 = n - 1, k = n / 2;
int pivot, s1 = 0, s2 = 0;
int flag = 1;
int i;
while(flag){
while(low < high){
pivot = A[low];
while(low < high && A[high] >= pivot) --high;
A[low] = A[high];
while(low < high && A[low] <= pivot) ++low;
A[high] = A[low];
}
A[low] = pivot;
i = low;
if(i == k - 1) flag = 0;
if(i < k - 1){
low = ++low0;
high = high0;
}
if(i > k - 1){
high = --high0;
low = low0;
}
}
}