【八大排序(三)】快速排序

❣博主主页: 33的博客❣
▶️文章专栏分类:八大排序◀️
🚚我的代码仓库: 33的代码仓库🚚
🫵🫵🫵关注我带你了解更多排序知识

在这里插入图片描述

目录

  • 1.前言
  • 2.快速排序
    • 2.1概念
    • 2.2画图理解
    • 2.3递归代码实现
      • 2.3.1Hoare法
      • 2.3.2挖坑法
      • 2.3.3前后指针法
      • 2.3.4优化
    • 2.4非递归代码实现
  • 3.总结

1.前言

关于排序的知识,我们已经介绍了直接插入排序,希尔排序,选择排序和堆排序,这篇文章博主就继续和大家分享快速排序的知识。

2.快速排序

2.1概念

快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割城两个子序,左子序中的元素均小于基准值,右子序的元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。

2.2画图理解

选择排序

2.3递归代码实现

2.3.1Hoare法

在这里插入图片描述

 public int[] quickOrder(int[] arr){int p=0;quick(0,arr.length-1,arr);return arr;}private void quick(int start, int end, int[] arr) {if (start>=end){return;}int p=partionHoare(start,end,arr);quick(start,p-1,arr);quick(p+1,end,arr);}public int partionHoare(int l,int r,int[] arr){int tmp=l;while (l<r){while (l<r&&arr[l]<arr[tmp]){l++;}while (r>l&&arr[r]>arr[tmp]){r--;}swap(l,r,arr);}//l==rswap(l,tmp,arr);return l;}

2.3.2挖坑法

在这里插入图片描述

    private void quick(int start, int end, int[] arr) {if (start>=end){return;}int p=partitionHole(start,end,arr);quick(start,p-1,arr);quick(p+1,end,arr);}public int partitionHole(int l,int r,int[] arr){int tmp=arr[l];while (l<r){if (l<r&&arr[r]>tmp){r--;}arr[l]=arr[r];if (l<r&&arr[l]<tmp){l++;}arr[r]=arr[l];}arr[l]=tmp;return l;}

2.3.3前后指针法

在这里插入图片描述

private void quick(int start, int end, int[] arr) {if (start>=end){return;}int p=partition(start,end,arr);quick(start,p-1,arr);quick(p+1,end,arr);}
private  int partition( int left, int right,int[] array) {int prev = left ;int cur = left+1;while (cur <= right) {if(array[cur] < array[left] && array[++prev] != array[cur]) {swap(cur,prev,array);}cur++;}swap(prev,left,array);return prev;

2.3.4优化

观察上述代码,我们发现我们的基准值都是第一个元素,如果一个了比较有序的数组,我们进行快排,就可能形成当分支的树,所有我们要堆基准值进行优化,选取最左边,最右边元素和中间元素比较大小,把值为中间的作为基准元素。

   public int[] quickOrder(int[] arr){int p=0;quick(0,arr.length-1,arr);return arr;}private void quick(int start, int end, int[] arr) {if (start>=end){return;}if (end-start>=15){insertOrder(start,end,arr);return;}int m=mid(start,end, arr);swap(start,m,arr);int p=int p=partitionHole(start,end,arr);quick(start,p-1,arr);quick(p+1,end,arr);}public void insertOrder(int l,int r ,int[] arr){for (int i=l+1;i<=r;i++){int tmp=arr[i];int j=i-1;for (;j>=0;j--){if(arr[j]>tmp){arr[j+1]=arr[j];}else break;}arr[j+1]=tmp;}}public  int mid(int l,int r,int[] arr){int mid=(l+r)/2;if (arr[l]<arr[r]){if(arr[mid]<arr[l]){return l;}else if (arr[mid]>arr[r]){return r;}else {return mid;}}else {//arr[l]>=arr[r]if (arr[mid]>arr[l]){return l;}else if (arr[mid]<arr[r]){return r;}else {return mid;}}}public int partitionHole(int l,int r,int[] arr){int tmp=arr[l];while (l<r){if (l<r&&arr[r]>tmp){r--;}arr[l]=arr[r];if (l<r&&arr[l]<tmp){l++;}arr[r]=arr[l];}arr[l]=tmp;return l;}   

2.4非递归代码实现

在这里插入图片描述

public int[] quickOrderNor(int[] arr){Stack<Integer> stack=new Stack<>();int s=0;int e=arr.length-1;int pivot=partitionHole(s,e,arr);if (pivot-1>s){stack.push(s);stack.push(pivot-1);}if (e-1>pivot){stack.push(pivot+1);stack.push(e);}while (!stack.isEmpty()){e=stack.pop();s=stack.pop();pivot=partitionHole(s,e,arr);if (pivot-1>s){stack.push(s);stack.push(pivot-1);}if (e-1>pivot){stack.push(pivot+1);stack.push(e);}}return arr;}

时间复杂度:
最好的情况下:O(N
logN)
最坏情况下:O(N^2) 逆序/有序
空间复杂度:
最好的情况下:O(logN)
最坏情况下:O(N) 逆序/有序
稳定性:不稳定
*

3.总结

快速排序是一个比较重要的排序算法,它可以用多种方法来实现,但不同方法的时间复杂度和空间复杂度。

下期预告:归并排序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/661506.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 写一个死锁的例子

public class DeadLock {public static void main(String[] args) {Object lock1 new Object();Object lock2 new Object();new Thread(new A(lock1,lock2),"线程A").start();new Thread(new B(lock1,lock2),"线程B").start();} }class A implements Run…

WORD排版常见问题与解决方案

前言 近期使用word软件进行论文排版工作&#xff0c;遇到了一些常见的问题&#xff0c;记录一下&#xff0c;避免遗忘。 基本配置 系统环境&#xff1a;win10/win11 word版本&#xff1a;Microsoft Office LTSC 专业增强版 2021 问题与解决方案 问题1&#xff1a;页眉显示内…

Mac好用又好看的终端iTerm2 + oh-my-zsh

Mac好用又好看的终端iTerm2 1. iTerm2的下载安装2. oh-my-zsh的安装2.1 官网安装方式2.2 国内镜像源安装方式 3. oh-my-zsh配置3.1 存放主题的路径3.2 存放插件的路径3.3 配置文件路径 1. iTerm2的下载安装 官网下载&#xff1a; iTerm2 2. oh-my-zsh的安装 oh-my-zsh是一…

激光共聚焦和白光干涉仪哪个好?

在精密测量领域&#xff0c;激光共聚焦显微镜和白光干涉仪是两种不同的高精度光学测量仪器。它们各自有着独特的应用优势和应用场景。选择哪种仪器更好&#xff0c;取决于具体的测量需求和样品特性。在选择适合特定应用的技术时&#xff0c;需要仔细考虑其特点和功能。 白光干…

常见的锁策略与死锁(详解)

文章目录 前言一、常见的锁策略1.乐观锁vs悲观锁2.重量级锁vs轻量级锁3.自旋锁vs挂起等待锁4.读写锁vs互斥锁5.公平锁vs非公平锁6.可重入锁vs不可重入锁可重入锁在哪释放锁 7.synchronized具体是采用了哪些锁策略呢?synchronized内部实现策略(内部原理)锁消除锁粗化 二、死锁1…

int类型的取值范围(为什么负数比正数表示的范围多一位)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;C语言基本概念 &#x1f337;追光的人&#xff0c;终会万丈光芒 目录 &#x1f3dd;1.int的基本概念&#xff1a; 空间大小&#xff1a; 有符号类型的表示形式&#xff1a; &#x1f3dd;2.…

《MySQL对库的基本操作》

文章目录 一、查看数据库列表查看数据库中的所有表想知道当前处于哪个数据库里 二、创建一个数据库三、删除一个数据库知道两个集1.字符集2.校验集修改数据库的字符集和编码集 不同的校验码对数据库的影响四、数据库的备份与恢复注意事项&#xff1a;备份数据库中的表 总结 一、…

纯血鸿蒙APP实战开发——发布图片评论

介绍 本示例将通过发布图片评论场景&#xff0c;介绍如何使用startAbilityForResult接口拉起相机拍照&#xff0c;并获取相机返回的数据。 效果图预览 使用说明 通过startAbilityForResult接口拉起相机&#xff0c;拍照后获取图片地址。 实现思路 创建CommentData类&#…

GPU 架构与 CUDA 关系 并行计算平台和编程模型 CUDA 线程层次结构 GPU 的算力是如何计算的 算力峰值

GPU 架构与 CUDA 关系 本文主要包含 NVIDIA GPU 硬件的基础概念、CUDA(Compute Unified Device Architecture)并行计算平台和编程模型,详细讲解 CUDA 线程层次结构,最后将讲解 GPU 的算力是如何计算的,这将有助于计算大模型的算力峰值和算力利用率。 GPU 硬件基础概念GP…

目标检测算法YOLOv3简介

YOLOv3由Joseph Redmon等人于2018年提出&#xff0c;论文名为&#xff1a;《YOLOv3: An Incremental Improvement》&#xff0c;论文见&#xff1a;https://arxiv.org/pdf/1804.02767.pdf &#xff0c;项目网页&#xff1a;https://pjreddie.com/darknet/yolo/ 。YOLOv3是对YOL…

【Unity动画系统】动画状态转换详解

动画状态转换 此空处可以改换新转换名字。 表示有多个转换&#xff0c;播放顺序不可调整。 Solo:表示只执行它们&#xff0c;其他没勾选的不考虑&#xff1b;都勾选了&#xff0c;哪个转换条件先满足&#xff0c;就先执行哪个转换;如果同时满足&#xff0c;那就按顺序执行。 M…

无人机+三维建模:倾斜摄影技术详解

无人机倾斜摄影测量技术是一项高新技术&#xff0c;近年来在国际摄影测量领域得到了快速发展。这种技术通过从一个垂直和四个倾斜的五个不同视角同步采集影像&#xff0c;从而获取到丰富的建筑物顶面及侧视的高分辨率纹理。这种技术不仅能够真实地反映地物情况&#xff0c;还能…