数组------奇数偶数排序

题目描述:
给定一个int型数组,要求将数组排序使得奇数都在偶数前面。
分析:
在快速排序过程中,有一个步骤是:选定枢轴元素,并使得枢轴元素前面的元素都小于它而后面的元素都大于它。我们可以比照此方法来实现题目要求,此时时间复杂强度仅为O(n)。
实现1:
使用两个指针一头一尾向中间扫描。

#include <iostream>
using namespace std;

bool isOddNumber(int data);
void oddEvenSort(int *arr, int length);

int main()
{
    int array[] = {-1, 6, 8, -5, 85, 76, -62, 91, 66, 80, 35, 63, 91, 99, -88};

    oddEvenSort(array, sizeof(array)/sizeof(int));
    cout << "after sort: " << endl;
    for(int i = 0; i < sizeof(array)/sizeof(int); i++)
    {
        cout << array[i] << " ";
    }
    cout << endl;

    return 0;
}

bool isOddNumber(int data)
{
    return (data & 1) == 1;
}

void oddEvenSort(int *arr, int length)
{
    if(arr == NULL || length < 1)
        return ;
    int *first = arr;
    int *right = first + length - 1;
    bool done = true;

    while(done)
    {
        while(isOddNumber(*first))
            first++;
        while(!isOddNumber(*right))
            right--;
        if(first < right)
        {
            swap(*first, *right);
            first++;
            right--;
        }
        else
        {
            done = false;
        }
    }
}

实现2:
两个指针 i 和 j 都从头开始扫描,初始时 j 指向数组头,而 i 指向 j 的前一个位置。每次先判断 *j 是不是奇数,若是则 i += 1 并且 swap(*i, *j)。直到 j 指向倒数第二个元素为止。最后swap(arr[i + 1], arr[last])。

void oddEvenSort2(int *arr, int first, int last)
{
    if(arr == NULL || first >= last)
        return ;
    int i = first - 1;
    for(int j = first; j < last; j++)
    {
        if(isOddNumber(arr[j]))
        {
            i += 1;
            swap(arr[i], arr[j]);
        }
    }
    swap(arr[i + 1], arr[last]);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值