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

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

相关文章

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

MybatisX快速生成增删改查的方法示例

《MybatisX快速生成增删改查的方法示例》MybatisX是基于IDEA的MyBatis/MyBatis-Plus开发插件,本文主要介绍了MybatisX快速生成增删改查的方法示例,文中通过示例代... 目录1 安装2 基本功能2.1 XML跳转2.2 代码生成2.2.1 生成.xml中的sql语句头2

golang实现延迟队列(delay queue)的两种实现

《golang实现延迟队列(delayqueue)的两种实现》本文主要介绍了golang实现延迟队列(delayqueue)的两种实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录1 延迟队列:邮件提醒、订单自动取消2 实现2.1 simplChina编程e简单版:go自带的time

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

一文教你Java如何快速构建项目骨架

《一文教你Java如何快速构建项目骨架》在Java项目开发过程中,构建项目骨架是一项繁琐但又基础重要的工作,Java领域有许多代码生成工具可以帮助我们快速完成这一任务,下面就跟随小编一起来了解下... 目录一、代码生成工具概述常用 Java 代码生成工具简介代码生成工具的优势二、使用 MyBATis Gen

Java List排序实例代码详解

《JavaList排序实例代码详解》:本文主要介绍JavaList排序的相关资料,Java排序方法包括自然排序、自定义排序、Lambda简化及多条件排序,实现灵活且代码简洁,文中通过代码介绍的... 目录一、自然排序二、自定义排序规则三、使用 Lambda 表达式简化 Comparator四、多条件排序五、

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

CentOS7增加Swap空间的两种方法

《CentOS7增加Swap空间的两种方法》当服务器物理内存不足时,增加Swap空间可以作为虚拟内存使用,帮助系统处理内存压力,本文给大家介绍了CentOS7增加Swap空间的两种方法:创建新的Swa... 目录在Centos 7上增加Swap空间的方法方法一:创建新的Swap文件(推荐)方法二:调整Sww

QT6中绘制UI的两种方法详解与示例代码

《QT6中绘制UI的两种方法详解与示例代码》Qt6提供了两种主要的UI绘制技术:​​QML(QtMeta-ObjectLanguage)​​和​​C++Widgets​​,这两种技术各有优势,适用于不... 目录一、QML 技术详解1.1 QML 简介1.2 QML 的核心概念1.3 QML 示例:简单按钮