某数组里存在乱序的正负数字,要求将负数放到左边,正数放到右边,并且正负数的相对位置不改变

先说下思路:

  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

某数组里存在乱序的正负数字,要求将负数放到左边,正数放到右边,并且正负数的相对位置不改变的相关文章

Fisher-Yates 乱序算法

这两篇博客[1][2]的模式是我心仪的一种科技博客的方式,提供源代码,显示运行图形结果,通俗地介绍理论原理. 直接把结论摘录下来吧. 随机算法如果写成如下形式 randomIndex = random.randint(0, len(items) - 1) 则得到一个偏序的结果,正确的写法是 randomIndex = random.randint(i, len(items) - 1) 只有这样,才能得到无偏的结果. 注: 所谓无偏,简单理解就是给定一个数组,随机乱序 n 多次,那么得到的结果应该

写一个函数实现数组中的元素随机乱序排序

//原生JS写一个函数实现一个shuffle方法,将数组中的元素随机乱序排序 var shuffle = function(arr){ var len,t,rand; for(var i =0;len = arr.length,i<len;i++){ rand = parseInt(Math.random()*len);//parseInt(Math.random()*(len-1-0)+1);或者rand = Math.floor(Math.random()*(len-1-0)+1);即Mat

iOS之数组的排序(升序、降序及乱序)

#pragma mark -- 数组排序方法(升序) - (void)arraySortASC{ //数组排序 //定义一个数字数组 NSArray *array = @[@(3),@(4),@(2),@(1)]; //对数组进行排序 NSArray *result = [array sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) { NSLog(@"%@~%@",

笔试算法题(28):删除乱序链表中的重复项 &amp; 找出已经排好序的两个数组中的相同项

出题:给定一个乱序链表,节点值为ASCII字符,但是其中有重复项,要求去除重复项并保证不改变剩余项的原有顺序: 分析:创建一个256(2^8)大小的bool数组,初始化为false,顺序读取链表,将字母对应位置为false的重新标记为true并保留节点,将字母对 应位置为true的保持并删除节点:时间复杂度为O(N),空间复杂度为常量.注意删除节点和不删除节点的情况下,pre和cur的移动操作不相同: 解题: 1 struct Node { 2 char value; 3 Node* next;

php 二维数组索引乱序 shuffle() 函数;

在实际开发中有一个打乱数组排序的案例 案例代码如下 public function index(){ if(IS_POST){ #获取卖单列表 $buy_list=M('buy')->where(['status'=>1])->field('num')->select(); #获取卖单列表 $sell_list=M('sell')->where(['status'=>1])->field('num')->select(); foreach($buy_list

js数组乱序输出 数组乱序排列

网上看的数组乱序输出,要么不合实际,要么代码繁琐.自己试了下,希望能给大家带来帮助. 重要思想也是Math.random*arr.length随机下标,然后删除取到的元素,继续随机下标. //将数组乱序输出 var arr = [1,2,3,4,5,6,7,8,9,10]; var newArr = []; for(var i=0; i<arr.length; i++){ var index = Math.floor(Math.random()*arr.length);//随机下标 newArr

2015-4-2的阿里巴巴笔试题:乱序的序列保序输出(bit数组实现hash)

分布式系统中的RPC请求经常出现乱序的情况.写一个算法来将一个乱序的序列保序输出.例如,假设起始序号是1,对于(1, 2, 5, 8, 10, 4, 3, 6, 9, 7)这个序列,输出是:123, 4, 567, 8, 9, 10 上述例子中,3到来的时候会发现4,5已经在了.因此将已经满足顺序的整个序列(3, 4, 5)输出为一行. 1 #include<stdio.h> 2 3 int main() 4 { 5 int num ; 6 while(scanf("%d"

Linq 对string[]字符串数组进行排序 (升序、降序、乱序)

using System; using System.Collections; using System.Linq; namespace ConsoleApp1 { class Program { static void Main(string[] args) { string[] array = { "a.m.", "a", "Smith", "Jones", "module", "zoolog

10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。

题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数.内存限制为 2G.只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存). 关于中位数:数据排序后,位置在最中间的数值.即将数据分成两部分,一部分大于该数值,一部分小于该数值.中位数的位置:当样本数为奇数时,中位数=(N+1)/2 ; 当样本数为偶数时,中位数为N/2与1+N/2的均值(那么10G个数的中位数,就第5G大的数与第5G+1大的数的均值了). 分析:明显是一道工