王道数据结构课后代码题p335 3.设计把所有奇数移动到所有偶数前面的算法(c语言代码实现)

这一题我们可以采用快速排序的思维去写

快速排序是一种常用的排序算法,它利用分治思想将一个序列分成两个子序列,并将小于某个数(称为基准数或枢纽元素)的元素移动到基准数的左侧,大于基准数的元素移动到基准数的右侧,然后对左右两个子序列分别递归进行快速排序,直到子序列中只剩下一个元素或为空时结束递归。

以下是快速排序的实现过程:

  1. 选取一个基准数,通常为序列的第一个元素或最后一个元素。
  2. 将序列分为两个子序列,第一个子序列中的元素都小于基准数,第二个子序列中的元素都大于基准数。
  3. 对两个子序列分别递归进行快速排序。

我们这一题不用设置基准元素,但是得设置一个临时变量,防止数据被覆盖。

 

就以这个为例

首先我们从i=0开始,j=9;

王道数据结构课后代码题p335 3.设计把所有奇数移动到所有偶数前面的算法(c语言代码实现)_第1张图片 

然后++i找到一个偶数,--j找到一个奇数

再交换i与j的值

王道数据结构课后代码题p335 3.设计把所有奇数移动到所有偶数前面的算法(c语言代码实现)_第2张图片

然后++i找到一个偶数,--j找到一个奇数

再交换i与j的值

王道数据结构课后代码题p335 3.设计把所有奇数移动到所有偶数前面的算法(c语言代码实现)_第3张图片

然后++i找到一个偶数,--j找到一个奇数

再交换i与j的值

王道数据结构课后代码题p335 3.设计把所有奇数移动到所有偶数前面的算法(c语言代码实现)_第4张图片

这就完成了遍历

下面我们来看一下代码该如何实现

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;
}

你可能感兴趣的:(排序,算法,数据结构,c语言,排序算法)