插入排序的一个应用-调整负数在前,正数在后,原来相对位置不变
2013-06-26 11:35
239 查看
网上看到一个程序设计面试题:大概的意思是说在一个整数数组中,将负数放在前面,将正数放在后面,要保证原来的相对顺序不能变化。
例如:
![](http://images.cnitblog.com/blog/498124/201306/26113502-7f8b98572b78459fbc4f92f140632b60.png)
分析:当然最简单的就是用空间换时间了,再开两个相同大小的数组,顺序遍历将负数和整数放在各自数组中,最后再整合在元数组中,时间复杂度O(n)。
觉得题目会有空间限制的,因此想办法怎么在就地进行交换来实现呢。这也是一种排序,只不过是看正负而已,相对位置不变是说的稳定性。因此联想到借鉴插入排序的思想可以解决问题,
数组只有一个数时,则不用操作;当大于一个数时,需要遍历n-1趟,当前s[i]和前面已经排好“序”的数组,进行比较,在这里不同的是,只要是遇到正数,就往后移动。(插入递增排序是要遇到小于当前的,就往后移动);有了思路实现起来就方便~(*^__^*) ~嘻嘻
下面给出自己实现的代码:
例如:
![](http://images.cnitblog.com/blog/498124/201306/26113502-7f8b98572b78459fbc4f92f140632b60.png)
分析:当然最简单的就是用空间换时间了,再开两个相同大小的数组,顺序遍历将负数和整数放在各自数组中,最后再整合在元数组中,时间复杂度O(n)。
觉得题目会有空间限制的,因此想办法怎么在就地进行交换来实现呢。这也是一种排序,只不过是看正负而已,相对位置不变是说的稳定性。因此联想到借鉴插入排序的思想可以解决问题,
数组只有一个数时,则不用操作;当大于一个数时,需要遍历n-1趟,当前s[i]和前面已经排好“序”的数组,进行比较,在这里不同的是,只要是遇到正数,就往后移动。(插入递增排序是要遇到小于当前的,就往后移动);有了思路实现起来就方便~(*^__^*) ~嘻嘻
下面给出自己实现的代码:
void change_arry_negative_positive(int *a,int length) { int i,j,temp; for(i=1;i<length;i++) //n-1趟插排 { j=i; temp = a[i]; //记录当前点,便于恢复赋值给插入 while(j > 0 && temp<0 && a[j-1]>0) //遇到正数,往后移动,插入前面最后负数后面 { a[j] = a[j-1]; j--; } a[j] = temp; } }
下面也给出实现插入排序的代码:
void dircect_insert_sort2(int *a,int length) { int i,j,temp; for(i=1;i<length;i++) { j=i; temp = a[i]; while(j > 0 && temp < a[j-1]) //此处是边比较,边移动,注意边界 { a[j]=a[j-1]; j--; } a[j] = temp; } } //这个版本,第一次写,纯模拟插入排序过程,不是很优化,其实可以边比较,边移动
void direct_insert_sort(int *s,int length) { int i,j,k,temp; for(i=1;i < length;i++)//需要n-1趟插排 { temp = s[i]; j=i; while(j>0 && temp < s[j-1]) //j临点,j+1待插入的位置,小的话,一直往前查找 j--; for(k=i-1;k >=j;k--) s[k+1]=s[k]; //数组往后移动,必须从最后一个往后移动 s[j] = temp; } }
相关文章推荐
- 数组排序后保证正数之间和负数之间的相对位置不变 负数在前 正数在后
- 一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的正负数之间相对顺序,比如: 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 要求时
- 一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的相对顺序.
- 调整数组顺序,使得奇数在前偶数在后,分别保证奇数和偶数之间的相对位置不变
- 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
- 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
- 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
- 将一个数组中所有的奇数放左边,偶数放右边,且原来数字的相对位置不变
- 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
- 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
- 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
- 剑指offer题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
- 这是一个我面试某公司的算法题目:对一个字符数组进行排序,根据给定的字符,大于它的,放在数组的左边,小于它的,放在数组的右边,且数组中的元素之间的相对位置要保持不变。
- 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
- 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
- 将数组中负数调到正数之前,但相对位置不变
- 【大家来一起讨论吧】百度面试题,假设一整型数组存在若干正数和负数,现在通过某种算法使得该数组的所有负数在正数的左边,且保证负数件和正数间元素相对位置不变。时空复杂度要求:o(n),o(1)