快速排序基石之荷兰国旗问题

本文介绍了如何解决荷兰国旗问题,即在数组中将小于、等于和大于某个数的元素分别归位。通过设定边界idx,遍历数组并根据元素与num的比较结果进行交换,最终实现原地排序。讲解了该问题的思路、图示及代码实现,强调了O(1)额外空间复杂度和O(N)时间复杂度的要求。为后续学习快速排序奠定基础。
摘要由CSDN通过智能技术生成

题目一:

给定一个数组 arr,一个数 num,请把小于等于 num 的数放在数组的左边,大于 num 的数放在数组的右边。

要求额外空间复杂度 O(1),时间复杂度 O(N)

思路:

以 num 为界把数组分为两部分:

1. 左侧 <= num 区域

2. 右侧 >= num 区域

那么我们可以设定一个边界的 idx,当前元素与 num 进行比较:

1. 如果 [i] <= num,边界右侧的元素与 [i] 之间的元素是 > num 的元素,所以我们首先要将 [i] <> 边界右侧元素进行交换,然后把边界右扩

2. 如果 [i] > num,那么边界不动,直接判定下一个元素

 

图示:

1. 初始边界 less = -1,当前元素 = 3,小于 5,与 less+1 元素交换(3)

2. 交换完成边界右扩,同理交换,并且右扩

 

3. 元素 6, 7 不满足,直接跳过,到达元素 4 ,进行交换(4<>6)

4. 如此循环,知道 cur 遍历完整个数组

 

 

 

 

代码:

void sortbynum(int *arr, int len, int num)
{
	int less = -1;
	int i;
	
	for(i=0; i<len; i++)
	{		
		if(arr[i] <= num) // [i] <= num
		{			
			swap(arr, i, less+1);
			less++;	
		}
		else // [i] > num
		{
			// just ignore
		}
	}	
}

 通过这种方式不断的将 小于边界右扩,把大于部分推向右侧

下一章节继续荷兰国旗问题的升级版本

再讲述完这两个部分后,我们会引入 快速排序,那个时候就清楚为什么要先了解荷兰国旗问题

更多数据结构算法详解

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值