【JAVA】快速排序

这篇具有很好参考价值的文章主要介绍了【JAVA】快速排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

快排,和冒泡排序一样,是同一类型的排序,都是交换排序

交换,涉及在遍历中比较,然后相互交换元素

冒泡排序是根据趟数两两比较,边比较边交换,快排也一样,不过冒泡是以顺序表的格式进行的,而快排则是建立在二叉树的基础上来完成遍历交换的~(个人理解)

快排有很多个版本,快速排序是一位名hoare的人发明的,快排有很多个版本,什么horae版本,什么挖坑法,什么双指针法,这里我们介绍horae版本,至于挖坑法和双指针以后有机会再说~


已经说了,快排基于二叉树的规则来进行排序,那么具体是怎么样的呢?

【JAVA】快速排序

比如说我们先搞一个无序数组,然后定义left和right分别是数组的头尾下标

然后定义一个基准值  key  这个key  是用来划分数组的,当遍历交换完一次后,key下标所对应的值会在这个数组的某个位置,但是key左边的元素都会比key下标对应的元素小,key左边的元素都会比key下标对应的元素值要大,这就很类似于二分查找的时候的划分一样~

那具体是怎么样遍历和划分的呢?下面让老衲给你画张图即可

 【JAVA】快速排序

 下面我来解说一下第一轮的过程,首先给出了一个无序数组,把6设置为基准,然后存一份,接着right开始减减,遇到比6小的就停下来,所以right先减到了3后,停下不动,此时3比6这个基准小,然后right不动了,开始轮到left++,left的目的是寻找比基准6大的值,所以left++到了7,就停下,此时left对应的7比基准6大,接着把right的3和left的7开始交换,交换后left对应3,right对应7,接着right接着开始往下减减,寻找比基准6小的值,当减到4的时候right停止不动,然后接left开始++,寻找比6大的值,一直++到right,没有再比6大值,并且此时left和right相遇,暗示着第一轮循环结束,此时left和right相遇后,把它们相遇下标的值,也就是4,开始和最开始的基准,也就是下标为0的值,也就是6,开始交换:完成交换后,你会发现此时6的左边都是比6小的数,6的右边都是比6大的数,接着根据6所在的位置,开始划分成两部分,一部分比6小,一部分比6大

划分好后,我们现在只看比6小的部分,比6大的部分同理,看懂比6小的部分就行了

划分后,我们看比6小的 把它当做一个新数组  值 为  4   2   3 

然后根据上面的过程再来一遍,我们把这个数组的0下标元素4看作基准值,然后right对应3,我们开始right--,我们发现此时right的3就是比4小的,所以不动,接着left开始++,找比4大的,一直++到3,没发现比4大的,此时left和right又相遇了,接着再次划分,只有比4小的部分,没有比4大的部分了,那么我们就划分出比4小的部分

划分出3  2  后,我们按照刚才的过程再来一遍,把3看作基准,right--找比3小的,left++找比3大的,直到left和right再次相遇,然后再划分

一直到最后只剩下一个节点2的时候,就完成了遍历,接着返回,没错,就是递归的返回,所以快排要基于二叉树加上递归来实现,嘻嘻~~~


下面展示代码,再说说细节~

public class 快排 {
    public static void main(String[] args) {
        int[] arr = {3,5,2,1,43,33,22,64,74,25,13,27,98,56,100,21,7};
        quickSort(arr);
        for(int x : arr){
            System.out.print(x + " ");
        }

    }

    public static void quickSort(int[] array){
        quick(array,0,array.length-1);
    }

    private static void quick(int[] array, int left, int right) {

        //递归结束条件:这里代表只有一个根   大于号:有可能没有子树  1  2  3   4  1为基准,pivot-1就越界了
        if(left >= right){
            return;
        }

        int pivot = partition(array, left, right);
        quick(array,left,pivot-1);
        quick(array,pivot+1,right);
    }

    public static int partition(int[] array,int start, int end){
        int i = start;//这里存开始时基准的下标,为了循环结束后,相遇值和基准值交换时能找到基准值的下标
        int key = array[start];//这是基准
        while (start < end){
            while (start < end && array[end] >= key){
                end--;
            }
            while (start < end && array[start] <= key){
                start++;
            }
            swap(array,start,end);
        }
        //到这里s和e相遇,把相遇值和基准值交换
        swap(array,start,i);
        return start;//返回基准下标
    }

    public static void swap(int[] array, int n, int m){
        int temp = array[n];
        array[n] = array[m];
        array[m] = temp;
    }

}

写快排就3个主要方法,一个是交换swap,一个是找基准partition,一个是递归过程quick方法,递归直到left >= right 的时候返回~


第一个方法quick是递归用的,主要是划分数组的功能,返回条件是left >= right

假如你的数组是1 2 3 4的话,我们让第一个元素为基准,如果要划分的话,只能划分比1大的部分,方法里面又会自动划分比1小的部分,也就是基准下标减一,那么就越界了


为什么要right先动,而不是left先动,那是因为我们以left为基准,如果left先动,划分好后,你会发现基准左边的值存在比基准大的值,而我们的策略是基准左边比基准小,基准右边比基准大~


partition方法里面有一个大while包含着两个小while,小while是独立的while,

所以要加上start < end

同时&&后面的array【end】 >= key, 为什么要是等于呢?如果不等于,假如你的数组头和尾相同

比如说   3  7 5  8  4   3,就会出现死循环了,3不大于3,而是等于3~


ok到这里就结束战斗了,老衲要去睡觉了~文章来源地址https://www.toymoban.com/news/detail-429060.html

到了这里,关于【JAVA】快速排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 排序 | 冒泡 插入 希尔 选择 堆 快排 归并 非递归 计数 基数 排序

    排序算法是一种将一组数据按照特定顺序排列的算法。数据结构排序算法的选择取决于数据的特征、规模和性能需求。 接下来我们就要实现排序~~ 我们需要实现的一些功能: 冒泡排序是一种基本的排序算法,其核心思想是通过多次交换相邻元素的位置,使得每一轮循环都将

    2024年02月04日
    浏览(54)
  • 【C语言】冒泡排序的快排模拟

    说到排序,必然绕不开两个排序, 冒泡排序 与 快速排序 冒泡排序是大多数人的启蒙排序,因为他的 算法简单。但效率不高 ,便于新手理解; 而快速排序是集大成之作, 效率最高 ,使用最为广泛。 今天这篇文章带来如何使用 qsort (quick sort,快速排序),和如何使用冒泡

    2024年02月09日
    浏览(33)
  • 【Java 排序】冒泡排序(升降序,Int类型,Double类型,多数组排序)(111)

    思路: 用二重循环实现,外循环变量设为i,内循环变量设为j。假如有n个数需要进行排序,则外循环重复n-1次,内循环依次重复n-1,n-2,…,1次。每次进行比较的两个元素都是与内循环j有关的,它们可以分别用a[j]和a[j+1]标识,i的值依次为1,2,…,n-1,对于每一个i,j的值依次

    2024年02月12日
    浏览(43)
  • 十大排序算法(冒泡排序、插入排序、选择排序、希尔排序、堆排序、快排、归并排序、桶排序、计数排序、基数排序)

    目录 一、冒泡排序: 二、插入排序: 三、选择排序: 四、希尔排序: 五、堆排序: 六、快速排序: 6.1挖坑法: 6.2左右指针法 6.3前后指针法: 七、归并排序: 八、桶排序: 九、计数排序: 9.1绝对映射: 9.2现对映射: 十、基数排序:  1、思路: 通过对待排序序列从前

    2024年03月11日
    浏览(56)
  • 【数据结构】带你玩转排序:堆排序、希尔排序、插入排序、选择排序、冒泡排序、快排(多版本)、归并排序

    英杰社区 https://bbs.csdn.net/topics/617804998 目录 常见算法的实现         插入排序         希尔排序         堆排序         选择排序         冒泡排序         快速排序         Hoare版本         随机选Keyi               三数取中         挖坑法  

    2024年02月08日
    浏览(57)
  • 数据结构排序——详解快排及其优化和冒泡排序(c语言实现、附有图片与动图示意)

    上次讲了选择排序和堆排序:数据结构排序——选择排序与堆排序 今天就来快排和冒泡 快速排序(Quick Sort)是一种常用的排序算法,它是由英国计算机科学家Tony Hoare于1959年发明的。快速排序的基本思想是通过分治的策略将一个数组分成两个子数组,然后分别对这两个子数

    2024年01月25日
    浏览(44)
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序,堆排序】超详细~~

    目录 冒泡排序(BubbleSort): 代码详解:  冒泡排序的优化:  选择排序(SelectSort): 代码详解:  插入排序(InsertSort): 代码详解:  希尔排序(ShellSort):  法一(交换法)代码详解:  法二(移位法--插入排序的优化)代码详解: 快速排序(QuickSort):  代码详解:  归并排

    2024年02月20日
    浏览(48)
  • 【排序算法】 快速排序(快排)!图解+实现详解!

    🎥 屿小夏 : 个人主页 🔥个人专栏 : 算法—排序篇 🌄 莫道桑榆晚,为霞尚满天! 什么是快排?快排的速度到底有多快呢?它们的思想和实现是什么样的? 本文会对这快速排序进行详解,绝对细致入微!让你彻底搞懂快排! 英国计算机科学家Tony Hoare在1960年为了解决计算

    2024年02月05日
    浏览(40)
  • 八大排序算法之快速排序(下篇)(快排的优化+非递归快排的实现)

    目录 一.前言 1.快速排序的实现: 快速排序的单趟排序(排升序)(快慢指针法实现):​ 2.未经优化的快排的缺陷 二.快速排序的优化 1.三数取中优化 优化思路: 2. 小区间插入排序优化 小区间插排优化的递归快排: 三.非递归快速排序的实现 1.快排一个难以避免的缺陷(暂不考虑三指针

    2024年02月02日
    浏览(50)
  • 快速排序(快排) (C语言实现)

    👋我是Brant_zero,一名学习C/C++的在读大学生。 🌏️我的博客主页​​​​​​➡➡Brant_zero的主页 🙏🙏 欢迎大家的关注,你们的关注是我创作的最大动力 🙏🙏         本篇博客学习内容是快速排序,快速排序有多种不同的版本和优化,我们这次的目的就是将这些版本

    2023年04月09日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包