快速排序(quickSort)
快速排序
算法思路:
1.选择一个基准值pivot,
2.利用partiton函数将数组划分为 [小于pivot, pivot, 大于pivot]的结构
2.分治递归arr左半部分与arr右半部分
平均时间复杂度:O(nlogn)
最佳时间复杂度:O(nlogn)
最差时间复杂度:O(n2)
空间复杂度:O(1)
稳定性:不稳定,由于pivot的选择不同,
在选择基准值的时候,越靠近中间,性能越好;越靠近两边,性能越差。
适合场景:待排序序列元素较多,并且元素较无序。
代码实现:
package mainimport ("fmt""math/rand"
)func main() {arr := []int{1, 7, 6, 5, 4, 9}quickSort(arr, 0, len(arr)-1)for _, v := range arr {fmt.Println(v)}
}func quickSort(arr []int, left, right int) {if left >= right {return}// 随机选择pivotpivot := rand.Intn(right-left) + leftarr[pivot], arr[right] = arr[right], arr[pivot]index := partition(arr, left, right)// 分治递归左半部分 arr[left : index[0] - 1]quickSort(arr, left, index[0]-1)// 分治递归右半部分 arr[index[1] + 1 : right]quickSort(arr, index[1]+1, right)
}// partition函数:找到与arr[j]相等的区间(arr[j]作为pivot)
// 返回等于pivot的左边界索引与右边界索引
func partition(arr []int, i, j int) []int {// L: 记录小于pivot的右边界索引// R: 记录大于pivot的左边界索引L, R := i-1, jfor i < R {// 如果arr[i] < arr[j]: L右移,交换arr[L]与arr[i],i递增if arr[i] < arr[j] {L++arr[L], arr[i] = arr[i], arr[L]i++// 如果arr[i] > arr[j]: R左移,交换arr[R]与arr[i]} else if arr[i] > arr[j] {R--arr[R], arr[i] = arr[i], arr[R]// 如果arr[i] == arr[j]: i递增} else {i++}}// 将arr[j]放到中间部分arr[R], arr[j] = arr[j], arr[R]return []int{L + 1, R}
}
快速排序(quickSort)相关推荐
- 快速排序(quicksort)算法实现
快速排序(quicksort)是分治法的典型例子,它的主要思想是将一个待排序的数组以数组的某一个元素X为轴,使这个轴的左侧元素都比X大,而右侧元素都比X小(从大到小排序).然后以这个X在变换后数组的 ...
- 快速排序(quickSort) 和 插入排序(insertSort)
1.快速排序(quickSort) (1)在数据集之中,选择一个元素作为"基准"(pivot). (2)所有小于"基准"的元素,都移到"基准" ...
- quicksort java_Java代码实现快速排序(QuickSort)
Java代码实现快速排序(QuickSort) 核心思想 如果要排序数组中下标从p到r之间的一组数据,我们选择p到r之间的任意一个数据为pivot(分区点). 我们遍历p到r之间的数据,将小于pivo ...
- 数据算法之快速排序(quickSort)的Java实现
本文的代码来自于<数据结构与算法(JAVA语言版)>,是笔者在网上找到的资料,非正式出刊版物.笔者对代码一些比较难以理解的部分添加了注释和图解,欢迎大家来讨论. 快速排序的基本思想是通过一 ...
- 排序1+3:基数排序(RadixSort),希尔排序(ShellSort)和快速排序(QuickSort)
1 基数排序 基数排序对于整数特别有效.是一种稳定的算法(意思是相同的数字不会交换关系).基数排序是根据数字的性质来逐步根据个位数,十位数,百位数分类求得排序结果的方法之一.它的想法如下: (1)先将 ...
- 快速排序--QuickSort()--递归版本
一.快速排序(递归版本) 1.快速排序模板(初始版本) void QuickSort(int* a, int begin, int end) {// 区间不存在,或者只有一个值则不需要在处理if (b ...
- 快速排序(QuickSort)算法介绍
算法简介 快速排序(Quicksort)是对冒泡排序的一种改进算法.由C. A. R. Hoare在1960年提出.该算法使用广泛.效率很高,是最重要的排序算法之一. 该算法的实现基本可分为以下几步: ...
- 快速排序-QuickSort
一.基本思想 1.在快速排序中,采取的主要的"拆"的思想 2.每一次将数组拆为两个部分,令中间元素为pivot,pivot左边的所有元素都会小于pivot,而pivot的右边的所有 ...
- java快速排序quicksort
public class QuickSortDemo {public static void main(String[] args) {int[] arr = {12,36,56,44,9,44,18 ...
- 排序算法--快速排序(QuickSort)、 3区快速排序(3 Way QuickSort)原理、适用场景及代码示例
快速排序 概念介绍 QuickSort快速和归并排序一样,是采用分治法解决问题的一个典型应用.它选择一个元素作为基准元素,并围绕选定的基准元素对给定数组进行分区. quickSort有很多不同的版本, ...
最新文章
- 前端入门 前端自学路线 web开发前端如何学习
- Python 列表 insert() 方法
- 全球只有4个人通关的游戏!不过如此
- 开发模式下浏览器不支持ES6
- 0网卡开启_中标麒麟Linux v7系统下设置双网卡bond或team绑定详细过程
- Java打印三角形(双层for循环)
- HTML多选框滚动条,08:HTMLayout 自定义滚动条样式
- 华为p40鸿蒙系统价格有好高,华为P40Pro参数逐步被确定,鸿蒙系统或成最大亮点,价格更给力!...
- Android ButterKnife示例
- python的模块(module)和包(package)
- Pinyin4j 汉字转拼音使用教程
- 网站搜索引擎优化外链工具
- DOS计算机设置登录密码,如何在DOS里设置计算机密码
- 六西格玛dfss_六西格玛设计DFSS概述
- 【saltstack】配置salt-master端REDIS_RETURN
- android中集成阿里云金融级实人认证
- 修改Oracle序列
- WPS Excel表格日期转文本 为数字问题
- 平板电脑安装软件_完美适配win7操作系统的平板电脑,专治软件不兼容
- 从大自然得到色彩的启示