(数组)数组排序,使所有奇数在左边,所有偶数在右边

题目:

在一个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;
}

 

运行结果:

两种方法的思路不一样,因此结果也不一致。

《(数组)数组排序,使所有奇数在左边,所有偶数在右边》

 

    原文作者:AndyJee
    原文地址: https://www.cnblogs.com/AndyJee/p/4463102.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞