/*
有两个数组a,b,大小都为n,数组元素的值任意整形数,无序;
要求:通过交换a,b中的元素,使[数组a元素的和]与[数组b元素的和]之间的差最小。
有两个数组a,b,大小都为n,数组元素的值任意整形数,无序;
要求:通过交换a,b中的元素,使[数组a元素的和]与[数组b元素的和]之间的差最小。
*/
时间复杂度O(nlogn),空间复杂度O(n)的解法:
#include<stdio.h>
#include<malloc.h>
#include<math.h>
#include<stdlib.h>
void Print(int* a, int n) {
if (0 >= n ) {
return;
}
int i;
for (i=0;i<n;i++) {
printf("%d ",*(a+i));
}
printf("\n");
}
int Partion(int* a, int low, int high) {
if (low >= high) {
return low;
}
int tmp = *(a+low);
while(low < high) {
while(*(a+high) > tmp && low < high) {
high --;
}
*(a+low) = *(a+high);
while(*(a+low) < tmp && low < high) {
low ++;
}
*(a+high) = *(a+low);
}
*(a+low) = tmp;
return low;
}
void Qsort(int* a, int start, int end) {
if (start < end) {
int position = Partion(a, start, end);
if (position > start) {
Qsort(a,start, position-1);
}
if (position < end) {
Qsort(a,position+1,end);
}
}
}
void Resort(int* a, int* b, int n) {
int* c = (int*)malloc(sizeof(int)*n*2);
int i,j=0;
for (i=0;i<n;i++) {
*(c+j++) = *(a+i);
*(c+j++) = *(b+i);
}
Print(c,2*n);
Qsort(c,0,2*n-1);
i= 0;j=0;
for(i = 0; i< 2*n -1;) {
*(a+j) = *(c+i++);
*(b+j++) = *(c+i++);
}
}
int main() {
int n;
int *a,*b;
printf("Input array length:\n");
scanf("%d,",&n);
printf("Your input is %d\n",n);
a = (int*)malloc(sizeof(int)*n);
b = (int*)malloc(sizeof(int)*n);
printf("Input first array:\n");
int i;
for (i=0;i<n;i++) {
scanf("%d,",a+i);
}
printf("Your input first array is :\n");
Print(a,n);
printf("Input second array:\n");
for (i=0;i<n;i++) {
scanf("%d,",b+i);
}
printf("Your input second array is :\n");
Print(b,n);
Resort(a,b,n);
Print(a,n);
Print(b,n);
return 0;
}