荷兰国旗问题-C语言实现

荷兰国旗问题 数组中的元素,小于e的排在数组左边 等于在中间 大于在右边

/*
 * 运行环境 win10 + vs2015
 * 结果:   运行正确
 * 编者:    倾斜的正弦波
 */
#include "stdafx.h"
#define Maxsize  10
int buffer[Maxsize] = {4, 3, 9, 1, 5, 6, 7, 2, 0, 11};

/*
 * 小于e的在数组的左边   大于e的在数组右边
 */
void div(int A[], int e)
{
	int low_cnt = -1;
	for (int i = 0; i < Maxsize; ++i)
	{
		if (A[i] < e)
		{
			int temp = A[low_cnt + 1];
			A[low_cnt + 1] = A[i];
			A[i] = temp;
			++low_cnt;
		}
	}
}

/*荷兰国旗问题  小于在左边   等于在中间  大于在右边*/
/*相当于数组被划分为了三个区域即 左边区域  中间区域  右边区域*/
void test_1(int A[], int e)
{
	int low = -1, high = Maxsize;
	int cur = 0, temp = 0;
	while (cur < high)
	{
		/*若当前元素cur小于e时 将当前元素与左边区域的后一个元素交换
		 * 然后左边区域扩大即low++    cur指向下一个即cur++
		 */
		if (A[cur] < e)
		{
			temp = A[low + 1];
			A[low + 1] = A[cur];
			A[cur] = temp;
			++low;
			cur++;
		}
		else if (A[cur] > e)
		{
			/*若当前元素cur大于e时 将当前元素与右边区域的第一个元素即high-1交换
			* 然后右边区域扩大即--high   
			* cur此时不变(因为交换过来的数是否大于小于e未知,需要再次比较此位置的数)
			* cur区别去上面小于的情况要注意!!!
			*/
			temp = A[high - 1];
			A[high - 1] = A[cur];
			A[cur] = temp;
			--high;
		}
		else if (A[cur] == e)
		{
			++cur;//相等当前右边直接到下一个  (相当于等于e的留在中间了)
		}
	}
}


int main()
{
	printf("hello world\n");
	//div(buffer, 5);
	test_1(buffer, 5);
	for (int i = 0; i < Maxsize; i++)
	{
		printf("%d ", buffer[i]);
	}
	printf("\n");
	return 0;
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值