(数组)数组排序,使所有奇数在左边,所有偶数在右边
2015-04-28 15:18
253 查看
题目:
在一个N个整数数组里面,有多个奇数和偶数,设计一个排序算法,令所有的奇数都在左边。请完成sort的代码实现(C++或Java)
C++:
void sort(int N, int[]a)
{
…
}
例如: 当输入a = {8,4,1,6,7,4,9,6,4},
a = {1,7,9,8,4,6,4,6,4}为一种满足条件的排序结果
思路:
1、Partition过程,从数组左右两边往中间扫,找到左边第一个偶数,找到右边第一个奇数,然后左右交换,直至二者相遇。2、遍历数组,遇到奇数则将它依次放在左边的位置,并与该位置的偶数交换,即第1个奇数放在第1个位置,第2个奇数放在第2个位置。。。具体实现参考代码。
代码:
#include <iostream> using namespace std; void swap(int &a,int &b){ int tmp; tmp=a; a=b; b=tmp; } void sort_1(int n,int a[]){ int left=0,right=n-1; while(left<right){ while((a[left]&1)==1 && (left<right)) left++; while((a[right]&1)==0 && (left<right)) right--; if(left<right){ swap(a[left],a[right]); left++; right--; } } } void sort_2(int n,int a[]){ int cnt=0; int tmp; for(int i=0;i<n;i++){ if(a[i]&1){ tmp=a[cnt]; a[cnt]=a[i]; a[i]=tmp; cnt++; } } } int main() { int a[]={3,4,2,5,9,8,7,6,0,1}; int n=sizeof(a)/sizeof(a[0]); sort_1(n,a); for(int i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl; int b[]={3,4,2,5,9,8,7,6,0,1}; sort_2(n,b); for(int i=0;i<n;i++) cout<<b[i]<<" "; cout<<endl; return 0; }
运行结果:
两种方法的思路不一样,因此结果也不一致。相关文章推荐
- 将一个数组中所有的奇数放左边,偶数放右边,且原来数字的相对位置不变
- 能实现把一个数组元素中的奇数放左边,偶数放右边
- 如何重新排列数组使得数组左边为奇数,右边为偶数
- 如何重新排列数组使得数组左边为奇数,右边为偶数,并使得空间复杂度为O(1),时间复杂度为O(n)
- 83.第 3 组百度面试题 数组使得数组左边为奇数,右边为偶数
- java数组中,然后把奇数放在数组的左边,偶数放在右边,方法二
- 重新排列数组,使得数组左边的数字为奇数,数组右边的数字为偶数
- 重新排列数组使得数组左边为奇数,右边为偶数
- 给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数
- 给定一个无序数组,请调整该数组,调整成奇数放在数组的左边,偶数放在数组的右边。但是奇数与奇数之间的相对顺序不变,偶数和偶数之间的相对顺序也不变。
- 给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数---百度笔试题
- 【每天一道算法题】给定一个存放整数的数组,要求数组左边为奇数,右边为偶数
- 程序员面试题目总结--数组(四)【数列中符合条件数对的个数、数组是否存在重复元素、重新排列数组使数组左边为奇数,右边为偶数、数组中的第二大数、数组中的最小值和最大值】
- 编程: 给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。
- 给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。要求:空间复杂度O(1),时间复杂度为O(n)
- 重新排列数组使得数组左边为奇数,右边为偶数--方法三
- 给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数
- 把一个数组划分成左边奇数右边偶数
- 给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数
- 题目:给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。