快速排序
算法思路:

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)相关推荐

  1. 快速排序(quicksort)算法实现

     快速排序(quicksort)是分治法的典型例子,它的主要思想是将一个待排序的数组以数组的某一个元素X为轴,使这个轴的左侧元素都比X大,而右侧元素都比X小(从大到小排序).然后以这个X在变换后数组的 ...

  2. 快速排序(quickSort) 和 插入排序(insertSort)

    1.快速排序(quickSort) (1)在数据集之中,选择一个元素作为"基准"(pivot). (2)所有小于"基准"的元素,都移到"基准" ...

  3. quicksort java_Java代码实现快速排序(QuickSort)

    Java代码实现快速排序(QuickSort) 核心思想 如果要排序数组中下标从p到r之间的一组数据,我们选择p到r之间的任意一个数据为pivot(分区点). 我们遍历p到r之间的数据,将小于pivo ...

  4. 数据算法之快速排序(quickSort)的Java实现

    本文的代码来自于<数据结构与算法(JAVA语言版)>,是笔者在网上找到的资料,非正式出刊版物.笔者对代码一些比较难以理解的部分添加了注释和图解,欢迎大家来讨论. 快速排序的基本思想是通过一 ...

  5. 排序1+3:基数排序(RadixSort),希尔排序(ShellSort)和快速排序(QuickSort)

    1 基数排序 基数排序对于整数特别有效.是一种稳定的算法(意思是相同的数字不会交换关系).基数排序是根据数字的性质来逐步根据个位数,十位数,百位数分类求得排序结果的方法之一.它的想法如下: (1)先将 ...

  6. 快速排序--QuickSort()--递归版本

    一.快速排序(递归版本) 1.快速排序模板(初始版本) void QuickSort(int* a, int begin, int end) {// 区间不存在,或者只有一个值则不需要在处理if (b ...

  7. 快速排序(QuickSort)算法介绍

    算法简介 快速排序(Quicksort)是对冒泡排序的一种改进算法.由C. A. R. Hoare在1960年提出.该算法使用广泛.效率很高,是最重要的排序算法之一. 该算法的实现基本可分为以下几步: ...

  8. 快速排序-QuickSort

    一.基本思想 1.在快速排序中,采取的主要的"拆"的思想 2.每一次将数组拆为两个部分,令中间元素为pivot,pivot左边的所有元素都会小于pivot,而pivot的右边的所有 ...

  9. java快速排序quicksort

    public class QuickSortDemo {public static void main(String[] args) {int[] arr = {12,36,56,44,9,44,18 ...

  10. 排序算法--快速排序(QuickSort)、 3区快速排序(3 Way QuickSort)原理、适用场景及代码示例

    快速排序 概念介绍 QuickSort快速和归并排序一样,是采用分治法解决问题的一个典型应用.它选择一个元素作为基准元素,并围绕选定的基准元素对给定数组进行分区. quickSort有很多不同的版本, ...

最新文章

  1. 前端入门 前端自学路线 web开发前端如何学习
  2. Python 列表 insert() 方法
  3. 全球只有4个人通关的游戏!不过如此
  4. 开发模式下浏览器不支持ES6
  5. 0网卡开启_中标麒麟Linux v7系统下设置双网卡bond或team绑定详细过程
  6. Java打印三角形(双层for循环)
  7. HTML多选框滚动条,08:HTMLayout 自定义滚动条样式
  8. 华为p40鸿蒙系统价格有好高,华为P40Pro参数逐步被确定,鸿蒙系统或成最大亮点,价格更给力!...
  9. Android ButterKnife示例
  10. python的模块(module)和包(package)
  11. Pinyin4j 汉字转拼音使用教程
  12. 网站搜索引擎优化外链工具
  13. DOS计算机设置登录密码,如何在DOS里设置计算机密码
  14. 六西格玛dfss_六西格玛设计DFSS概述
  15. 【saltstack】配置salt-master端REDIS_RETURN
  16. android中集成阿里云金融级实人认证
  17. 修改Oracle序列
  18. WPS Excel表格日期转文本 为数字问题
  19. 平板电脑安装软件_完美适配win7操作系统的平板电脑,专治软件不兼容
  20. 从大自然得到色彩的启示

热门文章

  1. python+appium,常见报错与解决方法
  2. Sniffer的讨论
  3. C++ 实现基数排序
  4. ppt讲解计算机的组成,计算机的组成讲解.ppt
  5. 魔乐科技安卓开发教程----李兴华----03菜单
  6. 关于S5PV210的DNW刷机
  7. 十六进制数据原样转换成字符串
  8. 脸部动作编码系统(FACS)应用
  9. .map文件用什么打开_Fusion 360 干货集:盘点那些可以用Fusion 360打开的设计文件...
  10. 人脸检测之MTCNN:测试代码理解