ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

快排、归并、并查集

2022-02-28 09:05:36  阅读:187  来源: 互联网

标签:归并 target nums int 查集 mid 快排 while 入侵


void quick_sort(vector<int>& nums, int l, int r) {
	if (l >= r) return;
	int mid = nums[(l + r) >> 1];
	int i = l - 1, j = r + 1;
	while (i < j) {
		do ++i; while (nums[i] < mid); 
		// 这里一定不可以 = 
		// 因为存在一种情况,我们比较的 target 刚刚好是一个区间的最大值或者最小值
		// 不加 = 号的话,i 和 j 都总是会入侵到对方的区间
		// 加了之后,会存在 
		// 如果target刚好是最大值,i入侵不到
		// 如果target刚好是最大值,j入侵不到
		// 一般情况下:扫描完一次之后
		// i = j + 1 分别入侵了 大于target 和小于target 的区域
		// 或者是 i == j 都入侵了 target
		do --j; while (nums[j] > mid);
		if (i < j) {
			swap(nums[i], nums[j]);
		}
	}
	cout << i << " " << nums[i] << " "<< j << " " << nums[j] << " " << mid << endl;
	quick_sort(nums, l,j);
	quick_sort(nums, j + 1, r);
	// 这里:
	// 可以是 j 和 j + 1
	// 也可以是 i - 1 和 i
	// 因为在最后,i 是向左进入了他不应该进入的地区:nums[i] >= mid
	// j 是向左进入了 他不该进入的地区, 所以是: nums[j] <= mid
	// 所以 j 需要被左侧包含进去,i需要被右侧包含进去
	/*所有的可能:
		按照顺序排好了:
		find 6
		0 1 2 3 4
		5 8 9
		i   j
		j i

		没按照顺序排好了:
		find 8
		0 1 2 3 4
		5 9 8
		i   j
		i j
		5 8 9
		i j
		j i*/
}

void quick_sort1(vector<int>& nums, int l, int r) {
	if (l >= r) return;
	int temp = nums[l];
	int i = l, j = r;
	while (i < j) {
		while (i < j && nums[j] > temp) --j;
		if (i < j) nums[i++] = nums[j];
		while (i < j && nums[i] < temp) ++i;
		if (i < j) nums[j--] = nums[i];
	}
	nums[j] = temp; 
	cout << i << " " << nums[i] << " " << j << " " << nums[j] << " " << temp << endl;
	quick_sort1(nums, l, j);
	quick_sort1(nums, j + 1, r);
	// 这个和第一个就不同
	// 这个快排的终止条件一定是 i == j
	// 而且是把 目标值放在了 i == j的位置上
	// 这个也能像第一种快排方法一样理解
	// 当快排序完成时:中间会有一条分界线 左边<= target 右边>= target
	// 但是第二种快排,当i和j有一个入侵到对方时,另一个就不会入侵了,最多走到i == j的位置
	// 而且这时把 target 放到了这个位置
}

标签:归并,target,nums,int,查集,mid,快排,while,入侵
来源: https://blog.csdn.net/DuoKingg/article/details/123174411

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有