快排1-荷兰国旗问题

题目一

(1)题目描述

给定一个数组arr,和一个数num,请把小于等于num的数放在数组的左边,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度O(N)。

 

(2)算法思路

假设给定的数组如下,数组大小为N,num=5.,X初始化为-1,表示的意思是下标<=X的数,都<=num。

规定,当前数若<=num,则将此值与X的下一个位置的数进行交换,然后将X的值改为当前值的下标(换个意思,也就是<=num的区域增加了),然后继续下一个数;若当前数>num,则不进行任何操作,继续下一个数。

按照上述规定,流程如下:

①第一步:X = -1,下标为0的值为4 <= 5,则先将此值与X的下一位置的值进行交换,X的下一个位置也就是数组下标为0,则4与4自身交换,然后将X的值修改为0;如下图:

②第二步:X = 0,下标为1的值为6,不进行任何操作,继续下一个数;

③第三步:X = 0,下标为2的值为7,不进行任何操作,继续下一个数;

④第四步:X = 0,下标为3的值为3 <= 5,则先将此值与X的下一位置的值(也就是6)进行交换,然后X的值修改为1,继续下一个数;如下图:

   

⑤第五步:X=1,下标为4的值 5 <= 5,则先将此值与X的下一位置的值(也就是7)进行交换,然后X的值修改为2,继续下一个数,如下图:

⑥第六步:继续以上流程,直到下标为N-1。

 

(3)算法实现

void splitArray(std::vector<int> &arr, int num)
{
	int arraySize = arr.size();
	if (arraySize < 2)
		return;

	int i;
	int x = -1;
	for (i = 0; i < arraySize, ++i)
	{
		if (arr[i] <= num)
		{
			arr[i] = arr[x + 1];
			++x;
		}
	}
	return;
}

 

题目二(荷兰国旗问题)

(1)算法描述

给定一个数组arr,和一个数num,请把小于num的数放在数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度O(N)。

 

(2)算法思路

假设给定的数组如下,数组大小为N=7,num=5.,X初始化为-1,表示的意思是下标<=X的数,都小于num;Y初始化为7,代表的意思是下标大于>=Y的数都大于num。

规定,当前数若<num,则将此值与X的下一个位置的数进行交换,然后将X的值改为当前值的下标(换个意思,也就是<num的区域增加了),然后继续下一个数;若当前数=num,则跳下一个数;若当前数>num,则将此值与Y的前一个位置进行交换,将Y的值减去1,然后再比较交换后的值与num的关系,继续上述操作。算法结束判断条件:当前数下标等于Y的下标。

按照上述规定,流程如下:

①第一步:X = -1,Y = 7,下标为0的值为3 < 5,则先将此值与X的下一位置的值进行交换,X的下一个位置也就是数组下标为0,则3与3自身交换,然后将X的值修改为0;如下图:

②第二步:X = 0,Y = 7,下标为1的值5 = 5,不进行任何操作,直接进行下一个数;

③第三步:X = 0,Y = 7,下标为2的值7 > 5,将此值先与Y的前一个数交换(也就是8),然后将Y的值减1,如下图:

然后比较交换后的数(也就是8 > 5),继续上述操作,与Y前一个数(也就是6交换),然后Y的值加1,如下图:

然后继续比较交换后的数(也就是6 > 5),继续上述操作,与Y的前一个数(也就是4交换),然后Y的值加1,如下图:

然后继续比较交换后的数(也就是4 < 5),这个时候则将此数与X的后一个数交换(也就是5),然后将X的值加1,继续下一个数,如下图:

 ④第四步:X = 1,Y = 4,下标为2的数为5=num,直接跳过,进行下一个数;下标为3的数为5=num,直接跳过,进行下一个数;此时下标为4 = Y,终止完成。

 

(3)代码实现

void splitArray1(std::vector<int> &arr, int num)
{
	int arraySize = arr.size();
	if (arraySize < 2)
		return;

	int x = -1, y = arraySize;
	int i;
	for (i = 0; i < arraySize && i != y; ++i)
	{
		if (arr[i] < num)
		{
			int temp = arr[i];
			arr[i] = arr[x + 1];
			arr[x + 1] = temp;
			++x;
		}
		else if (arr[i] == num)
		{
			continue;
		}
		else
		{
			int temp = arr[i];
			arr[i] = arr[y - 1];
			arr[y - 1] = temp;
			--y;
			--i;
		}
	}
}

 

 

参考资料:

1:《牛客网算法基础班02》

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值