java实现快速排序图解_快速排序图文详解

java实现快速排序图解_快速排序图文详解快速排序快速排序法介绍图解代码理解快速排序法介绍快速排序(QuickSort)是对冒泡排序的一种改进,基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。图解代码理解publicclassQuickSort{//从小到大排序publicvoidquickSort(intleft,intright,

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

快速排序法介绍

  • 快速排序(QuickSort)是对冒泡排序的一种改进,基本思想是:通过一趟排序将 要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

图解

在这里插入图片描述

代码理解

public class QuickSort { 
   

    //从小到大排序
    public void quickSort(int left, int right, int[] nums){ 
   
        if(left<right){ 
   
            //将小于nums[left]的值放左边,大于nums[left]的值放右边
            int index = partition(left, right, nums);
            //对左边部分进行快速排序
            quickSort(left, index, nums);
            //对右边部分进行快速排序
            quickSort(index+1, right, nums);
        }
    }

    private int partition(int left, int right, int[] nums) { 
   
        /** * 这一部分的理解,我们可以假设此时数组排序为【2,1,3,4,5】 * 那么while (left<right&&nums[right]>base) * 会循环到right=1 * 之后数组变化如下 * nums[left]=nums[right] * 【1,1,3,4,5】 * while (left<right&&nums[left]<base)循环到left=1 * nums[right]=nums[left]相当于什么都没做 * 此时left等于right,跳出循环 * 整个过程可以简化为 * base = nums[left] * nums[left]=nums[right] * nums[right]=base */
        int base = nums[left];
        while (left<right){ 
   
            while (left<right&&nums[right]>=base){ 
   
                right--;
            }
            nums[left] = nums[right];
            while (left<right&&nums[left]<=base){ 
   
                left++;
            }
            nums[right] = nums[left];
        }
        nums[right] = base;

        return left;
    }

    public static void main(String[] args) { 
   
        int[] nums = { 
   2,3,1,5,4};
        QuickSort quickSort = new QuickSort();
        quickSort.quickSort(0,nums.length-1, nums);
        for(int num:nums){ 
   
            System.out.println(num);
        }
    }
}

快速排序算法性能分析

  • 快速排序的时间性能取决于快速排序递归的深度
  • 在最优的情况下,Partition每次都划分得很均匀,如果排序n个数值,那么递归树的深度就为.log2n.+1(.x.表示不大于x的最大整数),即仅需递归log2n次,其时间复杂度为O(nlogn)
  • 在最坏的情况下,待排序的序列为正序或者逆序,每次划分只得到一个比上一次划分少一个数值的子序列,此时需要执行n-1次递归调用且第i次划分需要经过n-i次比较才能得到第i个数值,其时间复杂度为O(n^2)

算法图

  • 口诀:堆归选基与初始序列无关 快选希堆排序不稳定

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/179508.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android之include避免代码重复

    在做布局时,经常有些部分是重复的,比如title或者foot的地方,最简单的办法当然是直接复制过去,这里介绍include的用法,有过c++或者c经验的同学一看就明白了,就是把另一个布局包含进来.先看下实现的效果:里面上下各有两个文字布局,是用include包含进去的,直接看代码activity_main.xml:

    2022年3月11日
    42
  • STM32F103驱动GT911

    STM32F103驱动GT9110x00引脚连接://SCL——-PB10//SDA——-PB11//INT——–PB1//RST——–PB2IIC的SCL与SDA需要接上拉电阻!0x01模拟IIC:在模拟IIC的头文件中:定义所需的IO操作宏://IO操作函数#defineIIC_SCLPBout(10)//…

    2022年6月30日
    32
  • PKI体系_基于PKI体系的认证方式进行论述

    PKI体系_基于PKI体系的认证方式进行论述在非对称加密中,公钥可以通过证书机制来进行保护,但证书的生成、分发、撤销等过程并没有在X.509规范中进行定义。实际上,如何安全地管理和分发证书可以遵循PKI(PublicKeyInfrastructure)体系来完成。PKI体系核心解决的是证书生命周期相关的认证和管理问题,在现代密码学应用领域处于十分基础和重要的地位。需要注意,PKI是建立在公私钥基础上实现安全可靠传递…

    2022年8月22日
    9
  • hpStorm 10.0.1 激活码[在线序列号]

    hpStorm 10.0.1 激活码[在线序列号],https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
    49
  • C++实现堆排序算法[通俗易懂]

    1.实现堆排序算法   用C++实现一个堆排序。2.实现思想① 先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区 ② 再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换, 由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key。③ 由于交换后新的根R[1]可能违反堆性质,故应将当前无序…

    2022年4月12日
    38
  • show partitions 分区查询

    show partitions 分区查询前言查询的分区情况程序Jupyter#导入信息frompyspark.sqlimportSparkSession,RowfrompysparkimportSQLContextfrompyspark.sql.functionsimportudf,col,explode,collect_set,get_json_object,concat_ws,splitfrompyspark.sql.typesimportStringType,IntegerTy

    2022年6月26日
    53

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号