首页 > 其他分享 >快速排序模板及其理解

快速排序模板及其理解

时间:2024-07-15 15:54:39浏览次数:18  
标签:slow int 分区 qsort mid 理解 排序 模板 指针

快速排序在面试中经常用于考察面试者的代码能力,以下是我个人对如何手撕快排的一些理解:

原理:

快速排序的解决分为两个部分,分区(partition)和递归(recurse)。

分区是主要进行排序的功能,递归用于控制分区的次数。

分区的思想是:选定一个数,将所有小于这个数的数组元素都放在它的左侧,同理所有大于这个数的数组元素都放在它的右侧。此时,这个数在数组中就是有序的,它处于它应该在的位置。接下来对其左侧的区间进行分区:同样也是选定一个数……,右侧区间同理。一直进行分区这个操作,直到这个区间只有一个数,也就代表这个区间的父区间排序完毕。了解了快速排序的流程后,不难看出它和二叉树的遍历很像,每个区间二分进行分区并排序,就是二叉树遍历所有子节点并打印。

实现思路:

int partition(int l, int r){ // 分区函数
	int mid = nums[r]; // 选取最右侧的数组元素为界
	int fast = l, slow = l; // 定义快慢指针
	while(fast < r){
		if (nums[fast] < mid){
			swap(nums[fast], nums[slow]); // 将比mid小的放在slow指针的左边
			slow++; // slow右移,此时slow左侧的元素都比mid小
		}
		fast++;
	}
	swap(nums[r], nums[slow]); // 将mid与slow交换,此时该数组以mid为界,左边都比mid小,右边都比mid大
//  打印调试过程
//	for (int i = l;i < r;i++) cout << nums[i] << ' ';
//	cout << endl;
	return slow; // 返回mid的索引
}
void qsort(int l, int r){
	if (r > l){
		int mid = partition(l, r); // mid已经有序,以mid为基准
		qsort(l, mid - 1); // 对于mid左边的区域进行分区
		qsort(mid + 1, r); // 对于mid右边的区域进行分区
	} else return;
}

流程理解:

首先,我们输入一个数组,例如:

int nums[6] = {5, 3, 1, 6, 2, 4};

为了方便函数读取,我们将这个数组设置为全局变量(如果将nums设置在main函数中,在定义函数时同时将数组的地址传入也可)。

易知数组的l,r分别为0,5,在主函数中执行:

qsort(0, 5);

此时进行第一次的partition,我们默认取区间右边界的数为mid,也就是将4作为界。然后定义快慢指针,初始值都是l,使用while循环,每次循环快指针都往右走,一直走到r结束。

在快指针往右走的过程中,判断其遍历到的每一个数,如果这个数比mid小,那么就将这个数与慢指针指向的数位置互换。位置互换后,慢指针再右移一位。

以上这个操作,将使得原区间中所有比mid小的数,都在慢指针的左侧。慢指针所在的位置,就是mid应该处于的位置。所以最后将mid与慢指针指向的数位置交换,分区操作就完成了。

接下来以mid为界,不断划分区间进行递归:

qsort(l, mid - 1);
qsort(mid + 1, r);

直到划分为长度为1的区间,此时排序就算完成了,最后输出即可。

手撕思路:

1. 实现分区,分区需要快慢指针,快指针负责遍历,将所有比mid小的数都给慢指针;

2. 实现递归,左区间qsort,右区间qsort,返回条件为区间长度小于等于1;

标签:slow,int,分区,qsort,mid,理解,排序,模板,指针
From: https://blog.csdn.net/m0_73456105/article/details/140435273

相关文章

  • 解决equal to 运算中 "Chinese_PRC_CI_AS" 和 "Chinese_PRC_CS_AS" 之间的排序规则冲
    背景:在语句执行过程中碰到equalto运算中"Chinese_PRC_CI_AS"和"Chinese_PRC_CS_AS"之间的排序规则冲突的报错时,可以用COLLATE定义和控制字符数据排序规则。在SQLServer中,COLLATE是用于定义和控制字符数据排序规则(collation)的关键字。排序规则影响字符串比较和排序的行......
  • React中使用dnd-kit实现拖曳排序功能
    在React中使用`dnd-kit`库实现拖拽排序功能,你需要遵循以下步骤:1.**安装dnd-kit**:首先,确保你已经安装了`dnd-kit`库。如果还没有安装,可以通过npm或yarn来安装:  ```bash  npminstall@dnd-kit/core  ```2.**引入必要的组件和钩子**:从`dnd-kit`中引入`Draggable`、`DragO......
  • 【AI原理解析】—KAN原理
    目录一、理论基础与数学表示二、网络结构与特点1.权重与激活函数的创新2.节点与边的角色3.B样条表示三、学习机制与训练过程四、优势与应用1.优势2.应用五、未来展望Kolmogorov-ArnoldNetworks(KANs)是一种创新的神经网络架构,其独特的设计使其在处理复杂函数......
  • Python 集合:深入理解与应用
    一、引言1.在Python编程中,集合(Set)是一种强大而有用的数据结构。它具有独特的特性,适用于解决各种问题,特别是在处理不重复元素和集合操作时。二、集合的创建#使用花括号创建集合set1={1,2,3,4,5}#使用set()函数创建集合set2=set([5,6,7,8,9])三、集合......
  • 网站源码软件公司pbootcms模板网页设计主题
    软件公司的网站设计分享我很高兴向大家介绍我刚刚制作的软件公司的网站设计。友好的站点界面,是打动访客的第一步。软件公司网站主题网站设计通常旨在展示公司的专业性、技术实力以及服务优势。以下是对软件公司网站主题设计的介绍,分为几个关键部分进行阐述:整体设计风格:简洁......
  • 网站源码机电设备pbootcms模板网页设计主题
    机电设备的网站设计分享我很高兴向大家介绍我刚刚制作的机电设备的网站设计。友好的站点界面,是打动访客的第一步。机电设备网站主题网站设计需要突出机电设备的专业性、技术实力以及公司形象。以下是对机电设备网站主题设计的详细介绍:1.整体设计风格专业与技术感:整体设计......
  • 面试算法(排序)附带c++/python实现
            排序算法是面试中会经常会被问到的一类问题,如果可以掌握较多的排序算法,在面试过程中才更有机会被面试官看重哦,下面我们准备了一些常见的面试算法,并分别给出了c++和python的代码实现,小伙伴们一起学起来吧!冒泡排序(BubbleSort)        基于交换的排序,......
  • 【C语言】全面解析冒泡排序
    文章目录什么是冒泡排序?冒泡排序的基本实现代码解释冒泡排序的优化冒泡排序的性能分析冒泡排序的实际应用结论在C语言编程中,排序算法是一个非常基础且重要的概念。冒泡排序作为最简单、最易理解的排序算法之一,广泛应用于各种编程教学和实践中。本文将全面解析C语......
  • 深入理解Java中的String类
    深入理解Java中的String类大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在这篇文章中,我将详细介绍Java中的String类,并结合实际代码示例,帮助大家更好地理解和应用String类。1.String类概述String类是Java中最常用的类之一,用于表示不可变的字符序列。St......
  • 最大流模板
    P3376【模板】网络最大流#include<bits/stdc++.h>#definefo(i,a,b)for(ll(i)=(a);(i)<=(b);(i)++)#definefd(i,b,a)for(ll(i)=(b);(i)>=(a);(i)--)#definelc(o<<1)#definerc((o<<1)|1)#definemk(x,y)make_pair((x),(y))#defineebempla......