描述

对n个关键字取整数值的记录序列进行整理,以使所有关键字为负值的记录排在关键字为非负值的记录之前,要求:

①采用顺序存储结构,至多使用一个记录的辅助存储空间;

②算法的时间复杂度为O(n)。

输入

多组数据,每组数据两行。第一行为序列的长度n,第二行为序列的n个元素(元素之间用空格分隔,元素都为整数)。当n等于0时,输入结束。

输出

每组数据输出一行,为排序后的序列。每两个元素之间用空格隔开。

输入样例 1

6
1 2 3 4 -1 2
5
-1 2 3 -2 4

输出样例 1

-1 2 3 4 1 2
-1 -2 3 2 4

思路:

采用顺序存储结构又不希望占用多余的存储空间——使用vector存储,命名为v;

时间复杂度O(n),只能用一个辅助空间——双指针。

大致思路:双指针这个名字顾名思义,就是采用两个“指针”(其实看输出也能看出来,输出的结果恰恰就是从前往后第i个负数和从后往前第j个正数交换位置,再次印证双指针)

int i=0  ,  j=v.size()-1,规定i指向的数是正数,j指向的数是负数,因为题意要求是负数排在正数前面,一个从前往后遍历,一个从后往前遍历,当i指向的元素v[i]是负数,j指向的元素v[j]是正数时,采用一个int大小的辅助空间int temp交换v[i]和v[j]。

具体思路:当i!=j时,先进行两个循环判断使i、j到达各自的位置,之后再交换他们指向的元素就可以了;交换完毕后的i与j一定指向的是负数和正数,不需要再交换,所以令i、j分别指向自己的下一个位置。注意一旦一个指针走到头后,就说明遍历交换结束了,需要及时判断退出循环!!

#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<stack>
#include<set>
#include<map>
using namespace std;
//4025 双指针
void Create(vector<int>&v,int n)
{int temp;for (int i = 0; i < n; i++){cin >> temp;v.push_back(temp);}
}
void Sort(vector<int>&v,int n)
{int i = 0, j = n-1;//i正,j负while (i!=j){while (v[i] < 0)i++;while (v[j] > 0)j--;if (i == v.size()-1||j==0)break;int temp;temp = v[i];v[i] = v[j];v[j] = temp;i++;j--;}
}
void Print(vector<int> v)
{for (int i=0;i<v.size()-1;i++)cout << v[i] << ' ';cout << v[v.size()-1] << endl;
}
int main()
{int n;while (cin >> n && n != 0){vector<int> v;Create(v, n);Sort(v,n);Print(v);}return 0;
}

4025-数组的正负排序(C++,双指针法,附思路)相关推荐

  1. 数组-删除排序数组中的重复项(双指针法)

    题意: 给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件 ...

  2. LeetCode Python题解(一)----双指针法

    根据: github优秀创作者. 算法思想 1.双指针法 2.排序 3.贪心思想 4.二分查找 5.分冶 6.搜索 7.动态规划 8.数学 1. 双指针法: 双指针主要用于遍历数组,两个指针指向不同的 ...

  3. 题解——两种算法解Leetcode题库第977题(暨双指针法小结)

    一.Leetcode题库第977题题目 977. 有序数组的平方 二.解法一--暴力解法 算法思路:for循环遍历数组,对数组元素做平方操作:调用sorted()函数对处理后的数组进行快速排序 算法时 ...

  4. 剑指offer java版 test42—找出和为S的两个数,左右夹逼法(双指针法)

    前言:受上一题的启发,这题自己也编出来了.在碰到这种有序数列的时候,经常会用到双指针法,一个指左边,一个指右边,然后依照规则移动,增加或缩小范围.很实用. 题目: 输入一个递增排序的数组和一个数字S, ...

  5. 三数之和(双指针法)

    问题描述: //    给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. // // ...

  6. 链表-回文链表(复制+双指针法)

    题意: 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 思路: 这里如果是数组列表 ...

  7. 移除元素--双指针法

    数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖 暴力法 两层for循环,一个for循环遍历数组元素 ,第二个for循环更新数组. // 时间复杂度:O(n^2) // 空间复杂 ...

  8. 数据结构与算法 | 快速排序:Hoare法, 挖坑法,双指针法,非递归, 优化

    前两章讲解了排序中的选择排序和插入排序,这次就来讲一讲交换排序中的快速排序. 快速排序时间复杂度:平均 O(nlogn) 最坏 O(n2) 快速排序,顾名思义,它的排序的效率是非常高的,在数据十分杂乱 ...

  9. 【BZOJ4653】[Noi2016]区间 双指针法+线段树

    [BZOJ4653][Noi2016]区间 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含 ...

  10. 双指针法(leetcode分类解题,C++代码详细注释)

    双指针法 前言 167.两数之和 II - 输入有序数组 88.合并两个有序数组 142. 环形链表 II 633.平方数之和 680. 验证回文字符串 Ⅱ 27. 移除元素 344. 反转字符串 剑 ...

最新文章

  1. mac打开class文件
  2. 构建之法 阅读笔记01
  3. PHP案例 网页计数器设计
  4. 论文浅尝 - ICLR 2020 | 用于文本推理的神经模块网络
  5. linux环境 Oracle客户端连接远程Oracle服务端
  6. 在powerdesigner 中出现Could not Initialize JavaVM! 应该怎么解决
  7. 百面机器学习 #3 经典算法:01-1 线性可分(硬间隔)支撑向量机SVM
  8. 用python统计文章中单词出现的频次
  9. 嵌入式linux系统移植的四大步骤_嵌入式 Linux 产品技术评估之系统裁剪与启动速度...
  10. 编写一个成绩分类程序
  11. 鸡兔同笼(一道明显的体现cin和cout运行较慢的特点)
  12. php100网站怎么了
  13. 稳压二极管原理及使用
  14. 最新苹果CMS对接千月版本-畅视影视(V9.3开源)已搭建测试版
  15. 三角函数和角与差角公式的图形解释
  16. matlab优化工具箱OptimizationToolbox使用方法
  17. 计算机病毒1000字,《大鱼海棠》观后感1000字
  18. 分享一个简单好看的科技公司官网模板-纯HTML+CSS
  19. DAVINCI DM365-DM368开发攻略—U-boot-2010.12-rc2-psp03.01.01.39及UBL的移植
  20. [Iterview English] Dimission and Employ

热门文章

  1. 搭建cocos2d-x-android环境 Windows XP3 + Eclipse + NDKR7+COCOS2DX(没有用到cygwin和minigw)
  2. jQuery 树插件ZTree使用Demo
  3. sql语句的备份(导入、导出)
  4. 模板方法设计模式(未完待续)
  5. MySQL--REPALCE INTO操作
  6. UICollectionViewDelegateFlowLayout 使用
  7. 高程 第7章函数表达式 7.1递归 7.2闭包
  8. [转]ubuntu server:开机自动登录
  9. 搜索引擎排名点击跳转问题解决办法
  10. Leetcode-5199 Smallest String With Swaps(交换字符串中的元素)