版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_36669549/article/details/84929048
将数组c[1:n]中的所有奇数移动到偶数之前,要求时间复杂度为O(n)。
【分析】
这是西北大学考研试题。设置两个指示器i和j,分别从第一个元素向右从最后一个元素开始向左扫描,i遇到奇数略过,遇到偶数暂停,j遇到偶数略过,遇到奇数暂停,如果i<j,则交换i和j指向的元素,直到i≥j将结束,这样左边的元素就为奇数,右边的元素就为偶数。
main.cpp
#include <iostream>
using namespace std;
#include <iomanip>
#define MAX 100
void SplitArray(int c[],int n);
void PrintArray(int a[],int n);
void main()
{
int n;
int c[] = {29,54,68,32,49,21,396,207,181};
n = sizeof(c)/sizeof(c[0]);
cout << "数组c中的元素:" << endl;
PrintArray(c, n);
cout << "数组c调整后(左边元素为奇数,右边元素为偶数):" << endl;
SplitArray(c, n);
PrintArray(c, n);
system("pause");
}
void SplitArray(int c[], int n)
{
int i, j, t;
i = 0, j = n - 1;
while (i<j)
{
while (c[i]%2!=0)
{
i++;
}
while (c[j]%2==0)
{
j--;
}
if (i<j)
{
t = c[i];
c[i] = c[j];
c[j] = t;
}
}
}
void PrintArray(int a[], int n)
{
int i;
for (i = 0; i < n;i++)
{
cout << setw(4) << a[i];
}
cout << endl;
}
结果: