912. 升序排序数组
快速排序算法
快速排序是一种常用的排序算法,通过选择一个基准值,将数组分为左右两部分,然后对左右两部分分别进行递归排序,最终得到一个有序数组。
时间复杂度:
- 最好情况下,每次选择的基准值都能均匀地将数组分为两部分,此时时间复杂度为O(nlogn)。
- 最坏情况下,每次选择的基准值都是当前最大或最小的元素,此时时间复杂度为O(n^2)。
- 平均情况下,时间复杂度为O(nlogn)。
空间复杂度: 快速排序的空间复杂度主要取决于递归调用的栈空间,因此空间复杂度为O(logn)。
代码注释:
- 如果数组长度小于2,则直接返回数组本身。
- 调用快速排序函数,传入数组指针、左边界和右边界。
- 快速排序函数实现了快速排序的递归过程。
- partition函数采用三指针法来进行分区操作。
- 随机选择一个基准值curr。
- 初始化指针index和leftIndex为左边界。
- 进入循环,比较当前元素与基准值的大小关系,并根据大小进行元素交换和指针移动。
- 返回最终的左指针leftIndex和右指针rightIndex,作为下一次递归排序的边界。
- 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. 升序排序数组相关推荐
- LeetCode 912. 排序数组(Java)
912. 排序数组 你一个整数数组 nums,请你将该数组升序排列. 示例 1: 输入:nums = [5,2,3,1] 输出:[1,2,3,5] 提示: 1 <= nums.length &l ...
- Leetcode 912.排序数组(Sort an Array)
Leetcode 912.排序数组 1 题目描述(Leetcode题目链接) 给定一个整数数组 nums,将该数组升序排列. 输入:[5,2,3,1] 输出:[1,2,3,5] 输入:[5,1,1 ...
- Leetcode.912 排序数组
题目链接 Leetcode.912 排序数组 mid 题目描述 给你一个整数数组 n u m s nums nums,请你将该数组升序排列. 示例 1: 输入:nums = [5,2,3,1] 输出: ...
- LeetCode简单题之按照频率将数组升序排序
题目 给你一个整数数组 nums ,请你将数组按照每个值的频率 升序 排序.如果有多个值的频率相同,请你按照数值本身将它们 降序 排序. 请你返回排序后的数组. 示例 1: 输入:nums = [1, ...
- 指针||指针和数组||指针和函数||指针、数组、函数 案例描述:封装一个函数,利用冒泡排序,实现对整型数组的升序排序
指针 指针的基本概念 指针的作用: 可以通过指针间接访问内存 内存编号是从0开始记录的,一般用十六进制数字表示 可以利用指针变量保存地址 指针变量的定义和使用 指针变量定义语法: 数据类型 * 变量名 ...
- 【编程题目】输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。...
第 14 题(数组): 题目:输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字. 要求时间复杂度是 O(n).如果有多对数字的和等于输入的数字,输出任意 ...
- kotlin键值对数组_Kotlin程序以升序对数组进行排序
kotlin键值对数组 Given an array, we have to sort its elements in ascending order. 给定一个数组,我们必须按升序对其元素进行排序. ...
- 数组的合并和升序排列_leetcode 33 搜索旋转排序数组
给你一个升序排列的整数数组 nums ,和一个整数 target . 假设按照升序排序的数组在预先未知的某个点上进行了旋转.(例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0 ...
- LeetCode 1636. 按照频率将数组升序排序(哈希+排序)
文章目录 1. 题目 2. 解题 1. 题目 给你一个整数数组 nums ,请你将数组按照每个值的频率 升序 排序. 如果有多个值的频率相同,请你按照数值本身将它们 降序 排序. 请你返回排序后的数组 ...
最新文章
- 试题集 - 算法与编程
- 【oracle】补充 cursor 基本例子
- 问题解决: 解释器错误: 没有那个文件或目录
- 20145305 《Java程序设计》第7周学习总结
- 畅通工程 HDU - 1863
- UEditor1.2.6.0在.net环境下使用
- Python面向对象介绍
- 还在 Fine-tune 大规模预训练模型? 该了解下最新玩法 Prompt-tuning啦
- 对花不准(错版、套版不准、错花)的原因
- Java中获取request对象的几种方法
- oracle ^]字符,oracle 字符串操作
- 【day02】选择题题解
- 信息化与业务流程再造
- 【Linux】万字总结Linux 基本指令,绝对详细!!!
- [POJ2187]Beauty Contest(计算几何-旋转卡壳-最远点对)
- 如何系统的学习服务器相关知识?
- 检测电路故障c语言,常见的几种电路故障
- 计算机主机无反应,电脑突然开不了机、主机没反应、不显示,几个方法轻松解决...
- LCT求解最小生成树
- springboot整合mybatis (三) 一对多配置