题目描述:
给定一个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]);
}