【编程之法】2.6 不改变正负数相对顺序的重新排列
来源:互联网 发布:淘宝用了优惠券退款吗 编辑:程序博客网 时间:2024/04/30 00:29
题目描述
给定一个未排序的整数数组,数组中的元素有正数也有负数,要求对数组中的元素进行重新排列,使得负数排在正数的前面,并且不改变原来正数和负数之间的相对顺序。例如,如果输入是{1,7,-5,9,-12,15},则输出是{-5,-12,1,7,9,15}。要求时间复杂度为O (n),空间复杂度为O(1)
思路描述
由于不改变相对顺序,可以参考之前字符串中字符移动的代码,具体实现如下:
/** 这种算法的空间复杂度O(1) ,但是时间复杂度为O(2n)*/#include<iostream>#include<cstdio>using namespace std;const int maxn = 100;int num[maxn];int main(){ int n; cin >> n; for(int i = 0; i < n; ++i) { cin >> num[i]; } // begin int i = n-1; int j = n-1; int tmp; while(true) { while(i >= 0 && num[i] > 0) { --i; } if(i < 0) { break; } while(j >= 0 && (j >= i || num[j] < 0)) { // 通过 j >= i 实现 用 j 找到 i 之前最近的正数 --j; } if(j < 0) { break; } tmp = num[i]; num[i] = num[j]; num[j] = tmp; } // end for(int i = 0; i < n; ++i) { cout << num[i] << " "; } return 0;}
运行结果
我阅读了”Stable Minimum Space Partitioning in Linear Time”
但是其中的一些地方还是不太清楚,希望大家能够帮忙解决。
1 0
- 【编程之法】2.6 不改变正负数相对顺序的重新排列
- 不改变正负数相对顺序的重新排列
- 不改变正负数相对顺序的重新排列
- 不改变正负数相对顺序重新排列数组
- 不改变正负数相对顺序重新排列数组
- 不改变正负数之间相对顺序重新排列数组
- 不改变正负数之间相对顺序重新排列数组
- 不改变正负数之间的相对顺序重新排列数组
- 程序员编程艺术第二十七章:不改变正负数相对顺序重新排列数组(无解?)
- 程序员编程艺术第二十七章:不改变正负数相对顺序重新排列数组(无解?)
- 程序员编程艺术第二十七章:不改变正负数相对顺序重新排列数组(无解?)
- 不改变正负数相对顺序重新排列数组----一种解法
- 第二十七章:不改变正负数之间相对顺序重新排列数组
- 不改变正负数之间相对顺序重新排列数组(时间O(N),空间O(1))
- 算法,不改变正负数之间相对顺序重新排列数组.时间O(N),空间O(1)
- 不改变正负数之间相对顺序重新排列数组(时间O(N),空间O(1))(桶排序)
- [算法学习]不改变正负数之间相对顺序重新排列数组.时间O(N),空间O(1)
- [算法学习]不改变正负数之间相对顺序重新排列数组.时间O(N),空间O(1)
- 设备驱动开发前奏
- PHP流程控制break和continue小练
- Jquery中.css()与.addClass()两种方法设置样式的区别
- MySQL批量SQL插入性能优化
- POJ2049——Finding Nemo
- 【编程之法】2.6 不改变正负数相对顺序的重新排列
- 2016.8.3 HTML标签marquee实现滚动效果
- 压缩感知重构算法之正交匹配追踪(OMP)
- mysql 建立多个索引,加快查询速度
- android音量控制
- JAVA基础 补充 内部类
- ReviewForJob——快速排序(基于插入排序)+快速选择(快速排序变体)
- Android中的各类Span全面系统研究
- Java System.getProperty()