排序负数排在左边非负数排在右边

前言:把一堆整数负数排在左边非负数排在右边

思想:

从两端同时扫描待排序列,左边的关键字为负数的时候则扫描下一个关键字;直到第一个非负数,同理扫描右端的关键字;

把两端的关键字进行相应的交换的操作,直到左右扫描的索引碰头

代码:

复制代码
 1 /**
 2  把负数放到左边非负数放到右边
 3 
 4  @param R 待排数组
 5  @param len 数组中关键字的个数
 6  */
 7 void negative0Positive0(int R[],int len);
 8 void negative0Positive0(int R[],int len){
 9     
10     int i = 0;
11     int j = len-1;
12     int temp;
13     
14     for(;i<j;++i,--j){
15         
16         while (i< j && R[i] < 0) {
17             ++i;
18         }
19         
20         temp = R[i];
21         
22         while (i < j && R[j] >= 0) {
23             --j;
24         }
25         
26         R[i] = R[j];
27         R[j] = temp;
28         
29  
30     }
31     
32 }
View Code
复制代码

测试内容:

复制代码
1         int R[] = {1,2,-2,3,4,-3,0};
2         negative0Positive0(R, sizeof(R)/sizeof(int));
3         for (int i = 0; i < sizeof(R)/sizeof(int); i ++) {
4             printf("%d\t",R[i]);
5         }    
View Code
复制代码

测试结果

-3 -2 2 3 4 1 0 Program ended with exit code: 0

思考:

上边的算法的时间复杂度为O(n),空间复杂度为O(1)

但是并不能保证原来的正负数的相对顺序保持不变。

如果是要求保证原来的相对顺序不变的情况下,在空间件复杂度为O(n)的情况下;

在创建一个数组来放置关键字,然后从左边遍历的依次按照是为负数时放到目标数组;

然后,与此同时也从右边遍历源关键字记录,为非负数时放到目标数组的右边(从右向左放)。

这样应该能够保证关键字的相对顺序不变,这个内容以后再测试

见有的网址说,和快速排序把枢轴选到第一个关键字有关系,这个问题也在以后作补充吧。

 

参考资料:

严蔚敏版数据结构

数据结构高分笔记

https://www.zhihu.com/question/36500133

 

 

OS交流群欢迎你的加入!

群二维码:

先写到这么多

如有问题,敬请指正;

如需转载,请注明出处,谢谢!

 

posted on 2017-12-11 10:16  ITCoderW  阅读(947)  评论(0)    收藏  举报

编辑推荐:
· 糊涂啊!这个需求居然没想到用时间轮来解决。
· 浅谈为什么我讨厌分布式事务
· 在 .NET 中使用内存映射文件构建高性能的进程间通信队列
· 一个 java 空指针异常的解决过程
· 揭开 SQL Server 和 PostgreSQL 填充因子的神秘面纱
阅读排行:
· 从硬盘爆满到 GitHub 封号,一位前端开发者的开源历险记
· 微软又一自动化开源王炸,Selenium 慌了!
· 微服务的10大问题
· 糊涂啊!这个需求居然没想到用时间轮来解决。
· 性能优化:两条SQL索引优化,CPU占用率从40%降至25%
< 2025年7月 >
29 30 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 1 2
3 4 5 6 7 8 9

导航

统计

点击右上角即可分享
微信分享提示