先说下思路:

  1、先遍历数组,将正负数的个数求出来,当然,如果存在零值,也需要求出个数来

  2、根据之前求出的个数分别申请两个数组,用来存放正负数

  3、再次遍历数组,将正负数放进第二步申请的两个数组中,零值需要排除在外

  4、将第三步得到的两个数组再填回原始数组(也可以再申请一个数组存放结果)

  完成!

 

以下是代码(vs2013,64位win8):

 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     //定义一个原始数组
 7     int arra[] = { -1, 3, 9, 0, -5, -20, -3, 4, 0, 8, -12, 7 };
 8     int nummin = 0, nummax = 0, i = 0, j = 0;//nummin用于存储小于零的数字个数,
 9                                             //nummax用于存储大于零的数字个数,i, j用来循环遍历
10     bool zeroflag = false;//原始数组中是否有零的存在
11     int zerocount = 0;//如果原始数组中存在多个零,则求出具体个数
12 
13     //先打印一把原始数组
14     for (int i = 0; i < 12; i++)
15     {
16         cout << arra[i] << " ";
17     }
18     cout << endl;
19 
20     //遍历原始数组,分别求出大于零的数字个数和小于零的数字个数,以及是否存在零值
21     for (i = 0; i < 12; i++)
22     {
23         if (arra[i] > 0)
24         {
25             nummax++;
26         }
27         else if (arra[i] < 0)
28         {
29             nummin++;
30         }
31         else
32         {
33             zeroflag = true;
34             zerocount++;
35         }
36     }
37     //根据求出的正负数数量分别申请两个数组用于分别存放正负数
38     int *arrmin = (int*)malloc (sizeof(int) * nummin);
39     int *arrmax = (int*)malloc(sizeof(int) * nummax);
40     int k = 0, m = 0;//用于遍历赋值时作为两个数组的下标
41 
42     //顺序遍历原是数组,将正负数分别填进两个数组,并没有发生大小比较,
43     // 所以正负数的相对位置并没有发生改变,并且将零值排除出来了
44     for (i = 0; i < 12; i++)
45     {
46         if (arra[i] > 0)
47         {
48             arrmax[k] = arra[i];
49             k++;
50         }
51         else if (arra[i] < 0)
52         {
53             arrmin[m] = arra[i];
54             m++;
55         }
56     }
57 
58     //正负数已经分好,现在将两个数组再填回原始数组,当然也可以重新申请一个数组来保存结果
59     for (i = 0; i < nummin; i++)//先将负数填进去
60     {
61         arra[i] = arrmin[i];
62     }
63 
64     if (zeroflag)//如果存在零值
65     {
66         //按照得到的零值个数将数组中负数后面填上0
67         for (i = 0; i < zerocount; i++)
68         {
69             arra[nummin + i] = 0;
70         }
71 
72         //填完零之后紧接着就将正数填进去
73         for (int n = 0; n < nummax; n++)
74         {
75             arra[nummin + n + zerocount] = arrmax[n];
76         }
77     }
78     else    //如果不存在零值
79     {
80         //直接在负数后面添加正数即可
81         for (int n = 0; n < nummax; n++)
82         {
83             arra[nummin + n] = arrmax[n];
84         }
85     }
86 
87     //打印结果
88     for (int i = 0; i < 12; i++)
89     {
90         cout << arra[i] << " ";
91     }
92     cout << endl;
93 
94     return 0;
95 }

 

 

运行结果: