快速排序(单边、双边两种)

2024-04-06 04:04

本文主要是介绍快速排序(单边、双边两种),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

无论是单边快排还是双边快排都需要注意以下一些关键点:

1.快排核心在于递归。

2.每回都需要选择一个基准元素,将该基准元素放置正确位置,并且将比其小的元素统统移到该位置左边,比其大的元素移到该元素右边。

3.防置完毕后需要拿到基准元素的位置,再分别对左右两边调用该方法进行递归。

双边快排:

1.1.需要注意边界问题,两个指针移动时也要判断i<j。

1.2.需要注意最后ij重合的位置,需要考虑这个位置和基准元素的大小关系,因为都有可能。

package mainimport "fmt"// 双边快排
func quickSort(arr []int, left int, right int) {if left < right {pos := partition(arr, left, right)quickSort(arr, left, pos-1)quickSort(arr, pos+1, right)}
}func partition(arr []int, left int, right int) int {i := leftj := rightpivot := arr[left]for i < j {for i < j && arr[i] <= pivot {i++}for i < j && arr[j] > pivot {j--}//i==j,或者真的需要交换,交换即可swap(arr, i, j)}pos := iif arr[pos] > pivot {pos--swap(arr, left, pos)} else {swap(arr, left, pos)}return pos
}func swap(arr []int, i int, j int) {if i != j {temp := arr[i]arr[i] = arr[j]arr[j] = temp}
}//func main() {
//	arr := make([]int, 5)
//	arr[0] = 2
//	arr[1] = 1
//	arr[2] = 4
//	arr[3] = 3
//	arr[4] = 5
//	fmt.Println(arr)
//	quickSort(arr, 0, len(arr)-1)
//	fmt.Println(arr)
//}func main() {arr := make([]int, 8)arr[0] = 2arr[1] = 3arr[2] = 1arr[3] = 4arr[4] = 9arr[5] = 8arr[6] = 7arr[7] = 5fmt.Println(arr)quickSort(arr, 0, len(arr)-1)fmt.Println(arr)
}

单边快排:

2.1.需要额外注意,基准元素只能先选最后一个位置,因为在遍历过程中,第一个元素(位置较小的元素)有可能与其他比基准元素小的元素发生交换,最后想把基准元素放到应该的位置上时,却发现基准元素被换到未知地方去了

2.2.基准元素自身位置不需遍历 ,最后pointer指向的位置一定是大于基准元素的(如果有的话,否则是基准元素自身),因为比基准元素小的都移动到比pointer低的位置了,交换即可。没有的话pointer也会指向基准元素自身,交换与否无影响。

package mainimport ("fmt"
)// 单边快排
func quickSort(arr []int, low int, high int) {if low < high {pos := partition(arr, low, high)quickSort(arr, low, pos-1)quickSort(arr, pos+1, high)}
}// 返回基准元素的position,并将基准元素放在正确位置
func partition(arr []int, low int, high int) int {//基准元素取最高,防止基准元素交换位置被交换的未知位置pivot := arr[high]pointer := low//<high,high不用遍历for i := low; i < high; i++ {if arr[i] <= pivot {//swaptemp := arr[i]arr[i] = arr[pointer]arr[pointer] = temp//指针后移pointer++}}//基准元素一到正确位置上temp := arr[pointer]arr[pointer] = arr[high]arr[high] = tempreturn pointer
}func main() {arr := make([]int, 5)arr[0] = 2arr[1] = 1arr[2] = 4arr[3] = 3arr[4] = 5fmt.Println(arr)quickSort(arr, 0, len(arr)-1)fmt.Println(arr)
}

这篇关于快速排序(单边、双边两种)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/878955

相关文章

Python中lambda排序的六种方法

《Python中lambda排序的六种方法》本文主要介绍了Python中使用lambda函数进行排序的六种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录1.对单个变量进行排序2. 对多个变量进行排序3. 降序排列4. 单独降序1.对单个变量进行排序

shell脚本快速检查192.168.1网段ip是否在用的方法

《shell脚本快速检查192.168.1网段ip是否在用的方法》该Shell脚本通过并发ping命令检查192.168.1网段中哪些IP地址正在使用,脚本定义了网络段、超时时间和并行扫描数量,并使用... 目录脚本:检查 192.168.1 网段 IP 是否在用脚本说明使用方法示例输出优化建议总结检查 1

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

Rust中的Option枚举快速入门教程

《Rust中的Option枚举快速入门教程》Rust中的Option枚举用于表示可能不存在的值,提供了多种方法来处理这些值,避免了空指针异常,文章介绍了Option的定义、常见方法、使用场景以及注意事... 目录引言Option介绍Option的常见方法Option使用场景场景一:函数返回可能不存在的值场景

Python读取TIF文件的两种方法实现

《Python读取TIF文件的两种方法实现》本文主要介绍了Python读取TIF文件的两种方法实现,包括使用tifffile库和Pillow库逐帧读取TIFF文件,具有一定的参考价值,感兴趣的可以了解... 目录方法 1:使用 tifffile 逐帧读取安装 tifffile:逐帧读取代码:方法 2:使用

Open3D 基于法线的双边滤波

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 输入参数: 输出参数: 参数影响: 2.2完整代码 三、实现效果 3.1原始点云 3.2滤波后点云 Open3D点云算法汇总及实战案例汇总的目录地址: Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客 一、概述         基于法线的双边

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

hdu 1285(拓扑排序)

题意: 给各个队间的胜负关系,让排名次,名词相同按从小到大排。 解析: 拓扑排序是应用于有向无回路图(Direct Acyclic Graph,简称DAG)上的一种排序方式,对一个有向无回路图进行拓扑排序后,所有的顶点形成一个序列,对所有边(u,v),满足u 在v 的前面。该序列说明了顶点表示的事件或状态发生的整体顺序。比较经典的是在工程活动上,某些工程完成后,另一些工程才能继续,此时