快速排序(Java实现)

devtools/2024/10/25 4:52:54/

目录

快速排序的思想

代码实现

思路

代码

快速排序的特点


快速排序的思想

快速排序和冒泡排序一样,是一种交换排序。快速排序的核心思想也是分治,分而治之。给定一个数组,先选定一个元素作为枢轴,然后将大于枢轴的放在右边,小于枢轴的放在左边,然后再对左右两边的元素进行排序。

代码实现

思路

根据上面的分析,我们发现还是要用到递归。那先定义出口,当什么时候不需要继续递归了?当要排序的范围只有一个元素时,就可以return了。

拿到数组后,如果数组长度大于一个元素,那我们首先把第一个元素作为枢轴,然后就是将大于枢轴的放在右边,小于枢轴的放在左边   说起来轻松,具体是如何实现的呢。这里我们采取的方法比较巧妙,我们应用了双指针。L=0,R=length-1,我们把枢轴元素临时存储在temp中,那个数组的第一个位置(即L)就空了R从后往前找一个比temp小的元素,将其放在L所指位置,L++,此时R所指就空了,这个时候我们再从L往后找一个比temp大的元素,将其放在R所指位置,R--,循环进行,直至L和R相遇,即空白位置左边都比temp小,右边都比temp大,我们将temp放在L或R所指即可。(由于是我自己组织的语言,可能有表述不清楚的地方,如果大家不是非常理解,可以看一下
青岛大学数据结构王卓老师的讲解,很透彻。课程放这里了,大家有需要自行观看

代码

package algorithm.sort;public class QuickSort {public static void main(String[] args) {int[] nums = new int[]{2,4,6,83,4,62,2,1};qucikSort(nums,0,nums.length-1);for (int i = 0; i < nums.length; i++) {System.out.print(nums[i]+" ");}}//快速排序public static void qucikSort(int[] nums,int left, int right) {//判断排序长短,一定是小于等于,不然会死循环if(right<=left){return;}//找枢轴,划分左右两边int temp = nums[left];int i = left,j=right;while(i<j){//从后往前找一个比枢轴小的while(nums[j]>=temp && i<j)j--;//将其放在L所指位置if(i<j)nums[i++]=nums[j];//必须加if判断,不然i=j时也会执行了,然而i=j是要跳出来的,所以不要执行//从前往后找一个比枢轴大的while(nums[i]<=temp && i<j)i++;将其放在R所指位置if(i<j)nums[j--]=nums[i];}//将temp放在枢轴的位置上nums[i]=temp;//左右两边继续排序qucikSort(nums,left,i-1);qucikSort(nums,i+1,right);}
}

快速排序的特点

1. 不稳定的排序

2. 时间复杂度为O(nlogn),最差情况,即数组本身有序时,退化为冒泡排序,复杂度为O(n^{2})


http://www.ppmy.cn/devtools/97099.html

相关文章

MiDaS、ZoeDepth、Depth-Anything ai算法深度图估计

1、MiDaS 参考&#xff1a; https://github.com/isl-org/MiDaS https://pytorch.org/hub/intelisl_midas_v2/ https://colab.research.google.com/github/pytorch/pytorch.github.io/blob/master/assets/hub/intelisl_midas_v2.ipynb#scrollTo5A32CL3tocrZ 代码 import cv2 i…

如何建立一个既能快速记录又易于回顾的笔记系统?

在快节奏的学习和工作中&#xff0c;能够快速记录和回顾信息变得尤为重要。尤其对于编程学习者来说&#xff0c;构建一个高效、有序的笔记系统不仅可以提高学习效率&#xff0c;还能帮助我们在未来轻松回溯知识要点。本文将详细探讨如何打造一个既快速记录又易于回顾的笔记系统…

2024深圳国际汽车改装与定制技术展览会

2024深圳国际汽车改装与定制技术展览会时间&#xff1a;2024年12月4日-6日地点&#xff1a;深圳国际会展中心 详询主办方陆先生 I38&#xff08;前三位&#xff09; I82I&#xff08;中间四位&#xff09; 9I72&#xff08;后面四位&#xff09; 展会简介&#xff1a;伴随着…

大屏畅玩游戏,小米SU7迎来大升级,可连接蓝牙游戏手柄

嘿&#xff0c;朋友们&#xff01;今天我要和你们分享一个令人兴奋的消息。 小米SU7汽车迎来了一次重大升级&#xff0c;这不仅仅是技术上的飞跃&#xff0c;更是为驾驶体验带来了革命性的变化。想象一下&#xff0c;在宽敞的车内&#xff0c;通过连接蓝牙游戏手柄&#xff0c…

后端开发刷题 | 寻找峰值【二分法】

描述 给定一个长度为n的数组nums&#xff0c;请你找到峰值并返回其索引。数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回任何一个所在位置即可。 1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于 2.假设 nums[-1] nums[n] −∞ 3.对于…

数据结构---单链表实现

单链表是什么 我的理解是“特殊的数组”&#xff0c;通过访问地址来连接起来 1怎么创建链表 ----通过结构体&#xff08;成员有存入数据的data和指向下一个节点的地址的指针&#xff08;结构体指针&#xff09;next 初始架构---DataType 对应存入数据类型&#xff0c;此处的N…

【C++】匿名对象知识点

#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> using namespace std;class Solution { public:int Sum_Solution(int n){//...return n;} }; int main() {Solution s1; //s1的生命周期在main函数中s1.Sum_Solution(10);Solution(); //匿名对象生命周期就在这一…

STM32 定时器 输入捕获

用于测频率测占空比 IC(Input Capture)输入捕获 输入捕获模式下&#xff0c;当通道输入引脚出现指定电平跳变&#xff08;上升沿/下降沿&#xff09;时&#xff0c;会让当前CNT的值将被锁存到CCR中&#xff0c;可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数…