【程序练习】——交换两数组元素,使之和差最小
1 #include<stdio.h> 2 3 int main() 4 { 5 int a[5] = {3,5,6,1,4}; 6 int b[5] = {1,9,12,4,3}; 7 int c[10]; 8 9 int i,j = 0; 10 int k; 11 int tmp; 12 int flag; 13 14 //合并ab到c 15 for(i = 0; i < 5; i++) 16 c[j++] = a[i]; 17 18 for(i = 0; i < 5; i++) 19 c[j++] = b[i]; 20 21 22 //排序c 23 for(i = 0; i < 10; i++) 24 { 25 j = i; 26 for(k = i + 1; k < 10; k++) 27 { 28 if(c[j] > c[k]) 29 j = k; 30 } 31 32 if(j != i){ 33 tmp = c[j]; 34 c[j] = c[i]; 35 c[i] = tmp; 36 } 37 } 38 39 40 41 //用取头尾的方式对ab进行重新赋值 42 j = 0; 43 k = 0; 44 flag = 0; //创建一个标志 45 for(i = 0; i < 10 / 2; i++){ //一次循环只能执行一次取头取尾,取完就要跳出 46 if(j != 5){ 47 a[j++] = c[i]; //因为数组ab的长度都是5,而1取头尾的方法一次性取了两个,所以需要一个标志 48 flag = 0; 49 } 50 if(j != 5){ 51 a[j++] = c[10 - i - 1]; 52 flag = 1; 53 continue; //当a已经存满后并且已经取过尾了,要跳出此次循环,避免下面的b数组重复取数 54 } 55 56 //对两个标志和数组长度进行判断 57 if(j == 5 && k != 5 && flag == 0){ 58 59 b[k++] = c[10 - i - 1]; 60 flag = 1; //因为上个语句是在a取完头之后数组满了,需要数组b取尾,此语句只能执行一次,所以要修改标志,并跳出此次循环 61 continue; 62 } 63 if(j == 5 && k != 5 && flag == 1){ 64 b[k++] = c[i]; 65 b[k++] = c[10 - i - 1]; 66 } 67 } 68 69 for(i = 0; i < 10; i++) //打印合并并排好序的数组c 70 printf("%d\t",c[i]); 71 72 putchar('\n'); 73 74 for(i = 0; i < 5; i++){ //打印重新分配的数组a 75 printf("%d\t",a[i]); 76 } 77 78 putchar('\n'); 79 80 for(i = 0; i < 5; i++) //打印重新分配的数组b 81 printf("%d\t",b[i]); 82 }