这一题我们可以采用快速排序的思维去写
快速排序是一种常用的排序算法,它利用分治思想将一个序列分成两个子序列,并将小于某个数(称为基准数或枢纽元素)的元素移动到基准数的左侧,大于基准数的元素移动到基准数的右侧,然后对左右两个子序列分别递归进行快速排序,直到子序列中只剩下一个元素或为空时结束递归。
以下是快速排序的实现过程:
我们这一题不用设置基准元素,但是得设置一个临时变量,防止数据被覆盖。
就以这个为例
首先我们从i=0开始,j=9;
然后++i找到一个偶数,--j找到一个奇数
再交换i与j的值
然后++i找到一个偶数,--j找到一个奇数
再交换i与j的值
然后++i找到一个偶数,--j找到一个奇数
再交换i与j的值
这就完成了遍历
下面我们来看一下代码该如何实现
void move(int a[], int sz)
{
int i = 0;
int j = sz-1;
int temp = 0;
while (i < j)
{
while (i < j && a[j] % 2 == 0)//从前向后找到一个偶数
--j;
while (i < j && a[i] % 2 != 0)//从后往前找到一个奇数
++i;
if (i < j)//交换这两个元素
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
完整测试代码如下
#include
void move(int a[], int sz)
{
int i = 0;
int j = sz-1;
int temp = 0;
while (i < j)
{
while (i < j && a[j] % 2 == 0)//从前向后找到一个偶数
--j;
while (i < j && a[i] % 2 != 0)//从后往前找到一个奇数
++i;
if (i < j)//交换这两个元素
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
int main()
{
int a[] = { 2,1,4,5,6,7,3,8,10,9 };
int sz = sizeof(a) / sizeof(a[0]);
move(a, sz);
int i = 0;
for (i = 0; i < sz; i++)
printf("%d ", a[i]);
return 0;
}