【程序练习】——交换两数组元素,使之和差最小

 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 }

 

posted @ 2013-10-09 09:37  net小伙  阅读(741)  评论(0编辑  收藏  举报