首页 > 代码库 > 某数组里存在乱序的正负数字,要求将负数放到左边,正数放到右边,并且正负数的相对位置不改变
某数组里存在乱序的正负数字,要求将负数放到左边,正数放到右边,并且正负数的相对位置不改变
先说下思路:
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 else32 {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 //按照得到的零值个数将数组中负数后面填上067 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 }
运行结果:
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。