算法学习100天——8 快速排序2
题目地址(912. 排序数组)
https://leetcode-cn.com/problems/sort-an-array/
题目描述
给你一个整数数组 nums,请你将该数组升序排列。
示例 1:
输入:nums = [5,2,3,1]
输出:[1,2,3,5]
示例 2:
输入:nums = [5,1,1,2,0,0]
输出:[0,0,1,1,2,5]
提示:
1 <= nums.length <= 5 * 104
-5 * 104 <= nums[i] <= 5 * 104
代码
Java Code:
/**
* 快排的过程
* 1. 递归出口
* 2. 找基准点(随机基准点),并将基准点与数组首地址元素交换(或者尾地址的)
* 3. 根据基准点的值,将数组元素分为 小于等于 + 大于 两部分,并记录分界线
* 4. 将尾部基准点交换至分界线处的元素
* 5. 将除开基准值的两两端数组继续执行同样操作
* 最后得到一个升序数组
** 几个要注意的点:
* 1. 基准值可以不随机,但是遇到数组已经是升序或者降序的情况,时间复杂度度可能为O(N²)
* 2. 分界线处的交换要注意基准值的位置,避免二次打乱已排好的顺序
* 3. 递归必须要有出口。。。。
*/
class Solution {
public int[] sortArray(int[] nums) {
fastSort(nums, 0,nums.length - 1);
return nums;
}
private void fastSort(int[] nums, int left, int right){
// 递归出口
if(left >= right){
return;
}
// 随机一个基准点,并交换到数组首位置
generateRandomPosition(nums, left, right);
// 遍历数组,根据基准数排列
int pos = sort(nums, left, right);
// 基准数两边分别递归
fastSort(nums, left, pos - 1);
fastSort(nums, pos + 1, right);
}
private void generateRandomPosition(int[] nums, int left, int right){
int index =left + new Random().nextInt(right - left + 1);
swap(nums, index, right);
}
private int sort(int[] nums, int left, int right){
int i = left;
int pos = i;
// 双指针法,基于基准值对数组元素分类
while(i < right){
if(nums[i] <= nums[right]){
swap(nums, pos, i);
pos++;
}
i++;
}
// 将数组首位与 基准数应该在的位置值交换
swap(nums, pos, right);
// 返回基准数,用于分段
return pos;
}
private void swap(int[] nums, int left, int right){
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
}
结果
快排时间复杂度不稳定 ,数组排序还是归并好用一些
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2020-03-05 JAVA题目:正整数n若是其平方数的尾部,则称n为同构数 如:5*5=25, 25*25=625 问: 求1~99中的所有同构数
2020-03-05 JAVA 写一个方法,判断一个整数是否为素数
2020-03-05 JAVA题目:小芳的妈妈每天给她2.5元,她都会存起来,但是,每当这一天是存钱的第五题或者5的倍数的话,她都会去用掉6块钱。 问:至少经过多少天可以存到100块?
2020-03-05 JAVA 打印九九乘法表