《数据结构》严蔚敏 习题10.32 荷兰国旗问题

本文介绍了一种使用三路快速排序解决荷兰国旗问题的方法,通过将数组分为小于2、等于2和大于2的三个部分,实现了有效的排序。文章提供了完整的C语言实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题我是用快速排序来做的,将原数组分为三部分来思考问题
我一直参考的一份答案,发现他的思路其实和我是一样的:https://www.cnblogs.com/kangjianwei101/p/5609105.html
即当等于2的时候不动,继续扫描,大于2的时候就进行一个交换

#include<stdio.h>

//荷兰??国旗问题
//别理解错了,他是有很多个红白蓝小条,而不是只有三个

//这个可以用三路快排来做

#define RED 1
#define WHITE 2
#define BLUE 3

void swap(int *m ,int *n)
{
	int p;
	p = *m;
	*m = *n;
	*n = p;
}

void __nationflag(int arr[], int l, int r)
{
	int lt = l; //等于2的部分第一个元素的位置
	int gt = r; //大于2的部分的前一个元素的位置
	int i = l;
	while(i <= gt)
	{
		if(arr[i] < 2) //小于2的 就与 等于2的部分的第一个元素交换
		{
			swap(&arr[i],&arr[lt]);
			i++;   //继续扫描下一个元素
			lt++; //然后等于2的部分坐标要加一
		}
		else if(arr[i] > 2)
		{
			swap(&arr[i],&arr[gt]); //大于2的 就与 gt所指的元素交换
			gt --;   //gt指针向前移动一步,此时i并不移动,因为并不知道交换过去的是否小于2
		}

		else
		{
			i++;
		}
	}
}

void nationflag(int arr[],int n)
{
	__nationflag(arr,0,n-1);

}


void printArray(int a[],int n)
{
	int i;
	for(i = 0;i < n ; i++)
	{
		printf("%d ",a[i]);

	}

	printf("\n");

}



int main(int argc, char const *argv[])
{
	int arr[12] = {2,3,1,3,2,3,1,1,1,3,2,2};
	nationflag(arr,12);

	printArray(arr,12);
	

	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五月的天气

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值