使负数在正数之前,不改变原来的顺序

 1 /*
 2 不改变正负号序列,使得负数在正数前面,要求O(n),时间复杂度,O(1)空间复杂度
 3 实际情况,很可能做不到,可以用类似快排partition的方法,但是不能保证有序了,保证有序的一个方法是用翻转,例如
 4 2,3,4,-1,-2,3,-5,-6——————翻转为2,3,4,-1,-2,-5,-6,3-----翻转为-1,-2,-5,-6,2,3,4,3,最好情况可以为O(n),最坏为O(N2)
 5 方法二,采用插入排序的思想,时间复杂度直接O(n2),方法三,空间换时间,按顺序扫描,是负数就放一个数组中,正数放另一个数组,然后重新
 6 复制回去,O(n),空间也O(n)
 7 */
 8 #include <iostream>
 9 using namespace std;
10 #include <string>
11
12 /*
13 方法一,采用区间翻转法,2,3,4,-1,-2,3,-5,-6
14 */
15
16 void rotatefull(int *A ,int begin,int end)
17 {
18     while(begin<end)
19     {
20         swap(A[begin],A[end]);
21         begin++;
22         end--;
23     }
24 }
25 void rotate(int * A,int begin,int part,int end)     //例如3,-5,-6,part=0,begin=0,end=2
26 {
27     if(A==NULL)
28         return;
29     rotatefull(A,begin,part);
30     rotatefull(A,part+1,end);
31     rotatefull(A,begin,end);
32 }
33
34 void mainrotate(int *A,int begin,int end)
35 {
36     int i=end;                   //i递推往前探测
37     int j=end;                   //j作为每次翻转的负数的尾。
38     while(i>=0)
39     {
40         while(i>=0&&A[i]<0)
41             i--;
42         if(i<0)                        //全负数的情况
43             return;
44         int part=i;
45         while(i>=0&&A[i]>0)
46             i--;
47         rotate(A,i+1,part,j);         //这里就算是i<0了也要翻转,因为i+1开始翻转
48         j=j-(part-i);
49     }
50 }
51
52 /*
53  插入排序方法:O(n2),还有点意思,本来以为很容易,其实还是要动下脑子的
54 */
55 void mainrotate2(int *A,int n)
56 {
57     if(A==NULL)
58         return;
59     for(int i=1;i<n;i++)
60     {
61         int tmp=A[i];
62         int j=i-1;
63         while(tmp<0&&A[j]>0&&j>=0)
64         {
65             A[j+1]=A[j];
66             j--;
67         }
68         A[j+1]=tmp;
69     }
70 }
71
72 /*
73 变成浮点数的方法,其实同样是把空间变大了,相当于空间换时间。
74 思维比较巧妙,例如:3,4,-1,-3,5,2,-7,6,1  -------变成  -1.1,-2.3,-3.7   和   1.3,2.4,3.5,4.2,5.6,6.1,变很好变就是分别记录两个num_po和num_ne,然后就可以变了
75 但是有很大的缺陷啊,比如要是12呢,怎么知道是除以10还是除以100,变成0.12啊,所以只是个想法,但可行性不高。
76 */
77
78
79 int main()
80 {
81     int A[]={1,7,-5,-6,9,-12,15};
82     int n=7;
83     mainrotate(A,0,n-1);
84     //mainrotate2(A,n);
85     for(int i=0;i<n;i++)
86     {
87         cout<<A[i]<<endl;
88     }
89     system("pause");
90 }

使负数在正数之前,不改变原来的顺序,布布扣,bubuko.com

时间: 2024-10-25 11:05:32

使负数在正数之前,不改变原来的顺序的相关文章

数组排序使得数组负数在正数左边且按照原来的顺序

假设一整型数组存在若干正数和负数,现在通过某种算法使得该数组的所有负数在正数的左边,且保证负数件和正数间元素相对位置不变.时空复杂度要求分别为:o(n),o(1)例如     -3 4 2 -1 7 3 -5  排序后    -3 -1 -5 4 2 7 3 算法思想:从前往后遍历,记录第一个正数的位置,如果遇到负数就将负数插入到正数前面. 1 #include "stdafx.h" 2 #include <iostream> 3 using namespace std;

一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的 相对顺序 比如: input: 1,7,-5,9,-12,15 ans: -5,-12,1,7,9,15 要求时间复杂度O(N),空间O(1) 。

#include <iostream> using namespace std; void mSort(int *arr, int iLen) { int i, j, k, tmp; for(i = 0, j = 0; i < iLen; i++) { if (arr[i] < 0) { tmp = arr[i]; for(k = i; k > j; k--) arr[k] = arr[k - 1]; arr[j++] = tmp; } } } int main() { in

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

先说下思路: 1.先遍历数组,将正负数的个数求出来,当然,如果存在零值,也需要求出个数来 2.根据之前求出的个数分别申请两个数组,用来存放正负数 3.再次遍历数组,将正负数放进第二步申请的两个数组中,零值需要排除在外 4.将第三步得到的两个数组再填回原始数组(也可以再申请一个数组存放结果) 完成! 以下是代码(vs2013,64位win8): 1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 //定义一个原始数组

int和long long有符号整形 负数比正数多一个

int的负数比正数多一个,则有一个负数在int范围内没有对应的正数 最大正整数用十六进制,很容易表示:0x7f ff ff ff int num = 0x7fffffff; num = -num; printf("%d\n", num); printf("%d\n", -num); 最小负整数则是 int tnum = num - 1; printf("%d\n", tnum); printf("%d\n", -tnum);

Raphael.js改变元素层叠顺序

Raphael.js 元素(Element)改变层叠顺序,Raphael.js是一个矢量绘图库兼容svg和vml.初学时感觉css的z-index能搞定,结果是不支持,不过矢量绘图符合dom标准.可以改变dom加载顺序实现想要的结果. 1.看Raphael.js API,有关于改变层叠的方法,但只找到两个互换.查看源码发现有改变dom结构的方法. 2.XML DOM appendChild() 方法 移除原有元素插入到新位置.刚开始以为只新增,不移除原有.走了很多弯路,基础不扎实. 3.Raph

Git的本地操作--上(不会使github远程仓库发生任何改变)

1.先弄清楚git与github的关系 Git是最流行的分布式版本控制系统:[SVN,CVS这些版本控制系统,是集中式的,集中式的版本控制系统不但速度慢,而且必须联网才能使用.当然,Git的优势不单是不需要联网,Git极其强大的分支管理,也把SVN等抛在了千里之外] GitHub网站为开源项目免费提供Git存储,无数开源项目都托管在GitHub上,包括jQuery,PHP,Ruby等等. 可以简单的理解成: Git是一个管理代码的本地工具软件:github是托管代码的网站平台(可以托管团队里多个

Git的本地操作--下(不会使github远程仓库发生任何改变)

1.向Git仓库中[添加]文件 (1)在TEST文件夹下创建文件:a1.c $ touch a1.c 或者直接使用Vim创建并打开a1.c(之后按[i键]输入内容,输入完成之后按[ESC]退出该模式,然后[:wq]保存并退出): $ vim a1.c 使用[命令:git status]查看状态 (2)使用[命令:git add 文件名]将指定文件a1.php从工作区(Working Directory)提交到暂存区. $ git add a1.c (3)然后,将已经在"暂存区"中的文件

c++训练题(数字的2~6倍只改变数字的顺序)

题目:It can be seen that the number, 125874, and its double, 251748, contains exactly the same digits, but in a different order. Find the smallest positive integer, x, such that 2x, 3x, 4x, 5x, and 6x, contains the same digits. 大概意思是:某些数,比如125874, 2倍为2

initramfs扫描磁盘前改变磁盘上电顺序

背景: 机械硬盘需要12V 5V电源,此前设计是硬件电路默认5V有效.12V无效,然后系统通过驱动上12V电,对磁盘来说相当于先上5V后上12V,这种方式对大部分磁盘是可以的,但对于日立 HGST磁盘,冷启动(或未使能12V后reboot,使能12V后reboot会由于12V 5V都使能,重启(热启动)后会正确probe磁盘),系统在扫描磁盘时(执行initramfs中的init脚本中的`udevadm settle`)会检测到磁盘,但是由于12V未上,所以导致probe磁盘失败,由于驱动会循环