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

假设一整型数组存在若干正数和负数,现在通过某种算法使得该数组的所有负数在正数的左边,且保证负数件和正数间元素相对位置不变。时空复杂度要求分别为: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;
4
5 void SplitNumber(int* A, int size);
6 void PrintArray(int* A, int size);
7
8 int _tmain(int argc, _TCHAR* argv[])
9 {
10 int A[] = { 0, 2, -2, 3, -3, 4, 5, 7, -10 };
11 int size = sizeof(A) / sizeof(int);
12 PrintArray(A, size);
13 SplitNumber(A, size);
14 PrintArray(A, size);
15
16 return 0;
17 }
18
19
20 void PrintArray(int* A, int size)
21 {
22 for (size_t i = 0; i < size; i++)
23 {
24 cout << A[i] << " ";
25 }
26 cout << endl;
27 }
28
29 void SplitNumber(int* A, int size)
30 {
31 int posIndex=-1, negIndex=-1;
32 for (size_t i = 0; i < size; i++)
33 {
34 if (negIndex==-1)
35 {
36 if (A[i]<0 && posIndex >= 0)
37 {
38 negIndex = i;
39 }
40 if (A[i]>0 && posIndex < 0)
41 {
42 posIndex = i;
43 }
44 }
45 if (negIndex>=0&&posIndex>=0)
46 {
47 int tmp = A[i];
48 for (size_t i = negIndex; i >posIndex; i--)
49 {
50 A[i] = A[i - 1];
51 }
52 A[posIndex] = tmp;
53 posIndex++;
54 negIndex = -1;
55 }
56 }
57 }

数组排序使得数组负数在正数左边且按照原来的顺序,布布扣,bubuko.com

时间: 2024-10-11 00:18:17

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

60.编程统计数组a中正数、0、负数的个数

#include<iostream> using namespace std; int main() { int x=0,y=0,z=0; int a[10]; cout<<"please input 10 numbers:"<<endl; for(int i=0;i<10;i++) { cin>>a[i]; } for(int j=0;j<10;j++) { if(a[j]==0) { x++; } } for(int m=

输入一个整型数组,数组里有正数,也有负数。求所有子数组的和的最大值

题目: 输入一个整型数组,数组里有正数,也有负数. 数组中一个或连续的多个整数组成一个子数组. 求所有子数组的和的最大值.要求时间复杂度为 O(n). 解答: 1 public class Solution { 2 public static void main(String[] args) { 3 int[] arr = {1,-2,3,10,-4,7,2,-5}; 4 System.out.println(maxSub(arr)); 5 } 6 7 private static int ma

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

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),方法三,空间换时间,按顺序

ios开发数组排序(数组中包括字典)

iphone开发数组排序(数组中包括字典) 1.普通数组排序: NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"0",@"8",@"6",@"1",nil]; NSArray *sortedArray = [arr sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2){ if ([obj

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);

iphone开发数组排序(数组中包括字典)

原文地址 http://blog.csdn.net/bihailantian1988/article/details/8433812 iphone开发数组排序(数组中包括字典) 1.普通数组排序: NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"0",@"8",@"6",@"1",nil]; NSArray *sortedArray = [arr sortedA

编程题:指针数组实现,将多个字符串按字母顺序输出。

#include<stdio.h> void sort(char *str[],int n) { char *temp;int i,j,k; for(i=0;i<n-1;i++) {k=1; for(j=i+1;j<n;j++) if(strcmp(str[k],str[j])>0) k=j; if(k!=i) {temp=str[i];str[i]=str[k];str[k]=temp;} } } void main() { int i,n=4; char *string[

判定数组中的内容是相同的 不含顺序

/** 判定数组中的内容是相同的 不含顺序 @param {*} arr */ export function isEqualArray(arr1,arr2 ){ if(!(arr1 instanceof Array) || !(arr2 instanceof Array) || arr1.length !== arr2.length){ return false; } return JSON.stringify(arr1.sort()) == JSON.stringify(arr2.sort(

输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)

群里看到这道题,用python做了做, def find(array): v_sum = greatest = 0 for a in array: v_sum += a v_sum = 0 if v_sum < 0 else v_sum greatest = v_sum if v_sum > greatest else greatest if v_sum == 0: greatest = array[0] for a in array: greatest = a if greatest <