将数组里的负数排在数组的前面,正数排在数组的后面。但不改变原先负数和正数的排列顺序。
2013-06-22 19:47
756 查看
题目描述:将数组里的负数排在数组的前面,正数排在数组的后面。但不改变原先负数和正数的排列顺序。例:input: -5,2,-3, 4,-8,-9, 1, 3,-10;output: -5, -3,
-8, -9, -10, 2, 4, 1, 3。
算法描述:
①设定两个计数器begin、end,其中begin始终指向数组中的第一个负数,end始终指向位于begin之后的第一个正数。然后把begin、end之间的数字往后移,即让原来end位置的数字移动到begin位置,循环上述过程。直到end大于数组长度即break。
②设两个指针positive, negative,初始指向数组最后一个元素,然后从后往前遍历数组,positive每次指向第一个满足positive<negative的正数,negative指向最后一个负数,然后将positive+1到negative的元素往前移,将positive移至negative位置。循环上述过程,直至positive<0时。
-8, -9, -10, 2, 4, 1, 3。
算法描述:
①设定两个计数器begin、end,其中begin始终指向数组中的第一个负数,end始终指向位于begin之后的第一个正数。然后把begin、end之间的数字往后移,即让原来end位置的数字移动到begin位置,循环上述过程。直到end大于数组长度即break。
②设两个指针positive, negative,初始指向数组最后一个元素,然后从后往前遍历数组,positive每次指向第一个满足positive<negative的正数,negative指向最后一个负数,然后将positive+1到negative的元素往前移,将positive移至negative位置。循环上述过程,直至positive<0时。
#include <stdio.h> /* * Author : Tian Mo * * Date : 2013-06-22 19:37 * * Locate : Baidu PS, Beijing */ int SepPositiveNegative(int *v, const unsigned int len) { /* ASSERT ERROR */ if (NULL == v || len <= 0) { return -1; } int i,j,k,begin,end,temp; for(i = 0; i < len; ++ i) { /* From current data start compute */ k = i; while(v[k] >= 0) { ++ k; } /* Record the first negative always */ begin = k; while(v[k] < 0) { ++ k; } /* Record the first positive which after the first negative always */ end = k; /* if the last negative beyond the length of array v, must be break */ if (end > len - 1) { break; } /* Move the first positive which after the first negative to \ the place where the first negative begin */ temp = v[end]; for(j = end; j > begin; -- j) { v[j] = v[j - 1]; } v[begin] = temp; } return 0; } void print(const int *v, const unsigned int len) { printf("Items AS : "); unsigned int i; for (i = 0; i < len; ++ i) { printf("%2d ", v[i]); } printf("\n"); } int main() { int v[] = {-5, 2, -3, 4, -8, -9, 1, 3, -10}; //int v[] = {-5, 2, -3, 4, -8, -9, 1, 3, 12, 15, 19, -7,-2,}; //int v[] = {-1, -3, -5, -7, 1, 3, 5, 7, 9}; const len = sizeof(v) / sizeof(v[0]); print(v, len); if (-1 != SepPositiveNegative(v, len)) { print(v, len); } else { printf("Compute Data Error.\n"); } return 0; }
相关文章推荐
- 把数组中负数放在前面,0放中间,正数放后面,并保持相对顺序
- 一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的正负数之间相对顺序,比如: input: 1,7,-5,9,-12,15 ans: -5,-12,1,7,9,15 要求时
- 一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的正负数之间相对顺序,比如: input: 1,7,-5,9,-12,15 ans: -5,-12,1,7,9,15 要求时
- 一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的相对顺序.
- 一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的正负数之间相对顺序。 要求时
- 数组:f[a,A,h,f,H,F]实现一个排序的效果:[A,a,F,f,H,h],先按字母顺序排列,再把每个字母的大写字母写在前面,小写放在后面。
- 不改变正负数相对顺序,重排数组,使负数在正数之前
- 调整数组 使得数组中负数排在前面正数排在后面,并且正数和负数的相对位置不变 (递归思路)
- 重新排列数组,使得负数后面跟着正数,O(1)的空间
- 排序使得数组负数在正数左边且按照原来的顺序
- 面试题:把负数移动到正数之前,不能改变正负数原先的次序
- 剑指Offer-->调整数组顺序使奇数位于偶数前面,并按顺序排列(2种方法)
- 使负数在正数之前,不改变原来的顺序
- 将数组中负数放在正数前面
- 面试题:把负数移动到正数之前,不能改变正负数原先的次序
- 将数组的前n位顺序移到数组后面,后面的移到前面,如1 2 3 4 5 6 7,若n=3;则变为4 5 6 7 1 2 3
- java数组实现去重且不改变原先顺序
- 数组排列数组里的正数和负数排序
- 将数组中负数放在正数前面
- 排序使得数组负数在正数左边且按照原来的顺序