先说下思路:
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 }
运行结果:
某数组里存在乱序的正负数字,要求将负数放到左边,正数放到右边,并且正负数的相对位置不改变
时间: 2024-10-08 06:53:54