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

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

相关文章

Windows 上如果忘记了 MySQL 密码 重置密码的两种方法

《Windows上如果忘记了MySQL密码重置密码的两种方法》:本文主要介绍Windows上如果忘记了MySQL密码重置密码的两种方法,本文通过两种方法结合实例代码给大家介绍的非常详细,感... 目录方法 1:以跳过权限验证模式启动 mysql 并重置密码方法 2:使用 my.ini 文件的临时配置在 Wi

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的

Win11安装PostgreSQL数据库的两种方式详细步骤

《Win11安装PostgreSQL数据库的两种方式详细步骤》PostgreSQL是备受业界青睐的关系型数据库,尤其是在地理空间和移动领域,:本文主要介绍Win11安装PostgreSQL数据库的... 目录一、exe文件安装 (推荐)下载安装包1. 选择操作系统2. 跳转到EDB(PostgreSQL 的

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

Docker镜像pull失败两种解决办法小结

《Docker镜像pull失败两种解决办法小结》有时候我们在拉取Docker镜像的过程中会遇到一些问题,:本文主要介绍Docker镜像pull失败两种解决办法的相关资料,文中通过代码介绍的非常详细... 目录docker 镜像 pull 失败解决办法1DrQwWCocker 镜像 pull 失败解决方法2总