快速排序算法

快速排序是一种常用的排序算法,通过选择一个基准值,将数组分为左右两部分,然后对左右两部分分别进行递归排序,最终得到一个有序数组。

时间复杂度:

  • 最好情况下,每次选择的基准值都能均匀地将数组分为两部分,此时时间复杂度为O(nlogn)。
  • 最坏情况下,每次选择的基准值都是当前最大或最小的元素,此时时间复杂度为O(n^2)。
  • 平均情况下,时间复杂度为O(nlogn)。

空间复杂度: 快速排序的空间复杂度主要取决于递归调用的栈空间,因此空间复杂度为O(logn)。

代码注释:

  1. 如果数组长度小于2,则直接返回数组本身。
  2. 调用快速排序函数,传入数组指针、左边界和右边界。
  3. 快速排序函数实现了快速排序的递归过程。
  4. partition函数采用三指针法来进行分区操作。
  5. 随机选择一个基准值curr。
  6. 初始化指针index和leftIndex为左边界。
  7. 进入循环,比较当前元素与基准值的大小关系,并根据大小进行元素交换和指针移动。
  8. 返回最终的左指针leftIndex和右指针rightIndex,作为下一次递归排序的边界。
  9. getRandomIntInclusive函数用于生成一个在[min, max]范围内的随机整数。
func main()  {nums:=[]int{2,6,3,4,7,1,9,13,8}ansArr:=sortArray(nums)fmt.Println(ansArr)
}func sortArray(nums []int) []int {if len(nums) < 2 {return nums}quickSort(&nums, 0, len(nums)-1) // 调用快速排序算法对数组进行排序return nums
}func quickSort(nums *[]int, left int, right int) {if left >= right {return}leftIndex, rightIndex := partition(nums, left, right) // 划分数组并获取左右边界索引quickSort(nums, left, leftIndex-1)  // 对左子数组进行递归快速排序quickSort(nums, rightIndex, right)  // 对右子数组进行递归快速排序
}func partition(nums *[]int, leftIndex int, rightIndex int) (int, int) {// 三指针法curr := (*nums)[getRandomIntInclusive(leftIndex, rightIndex)] // 随机选择基准元素index := leftIndex // 当前索引for index <= rightIndex {if (*nums)[index] < curr { // 如果当前元素小于基准元素(*nums)[leftIndex], (*nums)[index] = (*nums)[index], (*nums)[leftIndex] // 交换当前元素与左边界元素leftIndex++ // 左边界索引右移index++ // 当前索引右移continue // 进入下一次循环}if (*nums)[index] == curr { // 如果当前元素等于基准元素index++ // 当前索引右移continue // 进入下一次循环}if (*nums)[index] > curr { // 如果当前元素大于基准元素(*nums)[rightIndex], (*nums)[index] = (*nums)[index], (*nums)[rightIndex] // 交换当前元素与右边界元素rightIndex-- // 右边界索引左移}}return leftIndex, rightIndex // 返回左右边界索引
}func getRandomIntInclusive(min int, max int) int {return min + rand.Intn(max-min+1) // 生成指定范围内的随机整数
}

912. 升序排序数组相关推荐

  1. LeetCode 912. 排序数组(Java)

    912. 排序数组 你一个整数数组 nums,请你将该数组升序排列. 示例 1: 输入:nums = [5,2,3,1] 输出:[1,2,3,5] 提示: 1 <= nums.length &l ...

  2. Leetcode 912.排序数组(Sort an Array)

    Leetcode 912.排序数组 1 题目描述(Leetcode题目链接)   给定一个整数数组 nums,将该数组升序排列. 输入:[5,2,3,1] 输出:[1,2,3,5] 输入:[5,1,1 ...

  3. Leetcode.912 排序数组

    题目链接 Leetcode.912 排序数组 mid 题目描述 给你一个整数数组 n u m s nums nums,请你将该数组升序排列. 示例 1: 输入:nums = [5,2,3,1] 输出: ...

  4. LeetCode简单题之按照频率将数组升序排序

    题目 给你一个整数数组 nums ,请你将数组按照每个值的频率 升序 排序.如果有多个值的频率相同,请你按照数值本身将它们 降序 排序. 请你返回排序后的数组. 示例 1: 输入:nums = [1, ...

  5. 指针||指针和数组||指针和函数||指针、数组、函数 案例描述:封装一个函数,利用冒泡排序,实现对整型数组的升序排序

    指针 指针的基本概念 指针的作用: 可以通过指针间接访问内存 内存编号是从0开始记录的,一般用十六进制数字表示 可以利用指针变量保存地址 指针变量的定义和使用 指针变量定义语法: 数据类型 * 变量名 ...

  6. 【编程题目】输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。...

    第 14 题(数组): 题目:输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字. 要求时间复杂度是 O(n).如果有多对数字的和等于输入的数字,输出任意 ...

  7. kotlin键值对数组_Kotlin程序以升序对数组进行排序

    kotlin键值对数组 Given an array, we have to sort its elements in ascending order. 给定一个数组,我们必须按升序对其元素进行排序. ...

  8. 数组的合并和升序排列_leetcode 33 搜索旋转排序数组

    给你一个升序排列的整数数组 nums ,和一个整数 target . 假设按照升序排序的数组在预先未知的某个点上进行了旋转.(例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0 ...

  9. LeetCode 1636. 按照频率将数组升序排序(哈希+排序)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数数组 nums ,请你将数组按照每个值的频率 升序 排序. 如果有多个值的频率相同,请你按照数值本身将它们 降序 排序. 请你返回排序后的数组 ...

最新文章

  1. 试题集 - 算法与编程
  2. 【oracle】补充 cursor 基本例子
  3. 问题解决: 解释器错误: 没有那个文件或目录
  4. 20145305 《Java程序设计》第7周学习总结
  5. 畅通工程 HDU - 1863
  6. UEditor1.2.6.0在.net环境下使用
  7. Python面向对象介绍
  8. 还在 Fine-tune 大规模预训练模型? 该了解下最新玩法 Prompt-tuning啦
  9. 对花不准(错版、套版不准、错花)的原因
  10. Java中获取request对象的几种方法
  11. oracle ^]字符,oracle 字符串操作
  12. 【day02】选择题题解
  13. 信息化与业务流程再造
  14. 【Linux】万字总结Linux 基本指令,绝对详细!!!
  15. [POJ2187]Beauty Contest(计算几何-旋转卡壳-最远点对)
  16. 如何系统的学习服务器相关知识?
  17. 检测电路故障c语言,常见的几种电路故障
  18. 计算机主机无反应,电脑突然开不了机、主机没反应、不显示,几个方法轻松解决...
  19. LCT求解最小生成树
  20. springboot整合mybatis (三) 一对多配置

热门文章

  1. Andriod Studio连接git出出错,supported Git2.9+,支持下载老版本的Git
  2. VR如何改变办公场所,听一听Meta的预测
  3. 自适应学习率调整:AdaDelta
  4. FTP服务搭建小白教程
  5. Linux基础命令---mkisofs
  6. python安装不了bs4_Python安装Bs4的多种方法
  7. 怎么把字母缩小当符号_我们一起学英语——英语初见:字母
  8. 机械手程序,六轴程序用信捷XD5和威纶触摸屏编写
  9. 人脸检测之是否佩戴口罩检测
  10. nodejs+vue婚纱摄影选片影楼管理系统