快速排序法

介绍:

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

示意图:

快速排序法

快速排序法

应用实例

要求: 对 [-9,78,0,23,-567,70] 进行从小到大的排序,要求使用快速排序法。【测试 8w 和 800w】

说明[验证分析]:

  1. 如果取消左右递归,结果是 -9 -567 0 23 78 70
  2. 如果取消右递归,结果是 -567 -9 0 23 78 70
  3. 如果取消左递归,结果是 -9 -567 0 23 70 78

代码实现:

package com.atguigu.sort;

import java.text.SimpleDateFormat;

import java.util.Date;

public class QuickSort {

    public static void main(String[] args) {
        // int[] arr = {-9,78,0,23,-567,70, -1,900, 4561};

        // 测试快排的执行速度
        // 创建要给80000个的随机的数组
        int[] arr = new int[8000000];
        for (int i = 0; i < 8000000; i++) {
            arr[i] = (int) (Math.random() * 8000000); // 生成一个[0, 8000000) 数
        }

        System.out.println("排序前");
        Date data1 = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date1Str = simpleDateFormat.format(data1);
        System.out.println("排序前的时间是=" + date1Str);

        quickSort(arr, 0, arr.length - 1);

        Date data2 = new Date();
        String date2Str = simpleDateFormat.format(data2);
        System.out.println("排序后的时间是=" + date2Str);
        // System.out.println("arr=" + Arrays.toString(arr));
    }

    public static void quickSort(int[] arr, int left, int right) {
        int l = left;// 左下标
        int r = right;// 右下标
        // privot 中轴值
        int pivot = arr[(left + right) / 2];
        int temp = 0;// 临时变量,作为交换时使用
        // while循环的目的是让比pivot值小放到左边
        // 比pivot值大放到右边
        while (l < r) {
            // 在pivot的左边一直找,找到大于等于pivot值,才退出
            while (arr[l] < pivot) {
                l += 1;
            }
            // 在pivot的右边一直找,找到小于等于pivot值,才退出
            while (arr[r] > pivot) {
                r -= 1;
            }
            // 如果l >= r说明pivot 的左右两的值,已经按照左边全部是
            // 小于等于pivot值,右边全部是大于等于pivot值
            if (l >= r) {
                break;
            }
            // 交换
            temp = arr[l];
            arr[l] = arr[r];
            arr[r] = temp;

            // 如果交换完后,发现这个arr[l]==pivot值相等 r--,前移
            if (arr[l] == pivot) {
                r -= 1;
            }
            // 如果交换完后,发现这个arr[r]==pivot值相等 l++,后移
            if (arr[r] == pivot) {
                l += 1;
            }
        }
        // 如果l == r,必须l++,r--,否则会出现栈溢出
        if (l == r) {
            l += 1;
            r -= 1;
        }
        // 向左递归
        if (left < r) {
            quickSort(arr, left, r);
        }
        if (right > l) {
            quickSort(arr, l, right);
        }
    }
}

运行截图:

快速排序法

从运行结果来看,快速排序算法速度较快。
这篇博客是我在B站看韩顺平老师数据结构和算法的课时的笔记,记录一下,防止忘记,也希望能帮助各位朋友。

Original: https://www.cnblogs.com/malinyan/p/QuickSort.html
Author: 蜀道,难
Title: 快速排序法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/616962/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Day10

    package com.oop;import java.io.IOException;//Demo1 类public class Demo1 { //main public sta…

    Java 2023年6月5日
    097
  • 我的第一个博客

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月9日
    080
  • 软件工程 毕业设计题目汇总

    软件工程毕业设计 题目汇总 【不断更新中】 微信小程序 校园表白墙微信小程序 【地址:程序地址】 房屋租赁管理系统 【地址:程序地址】 航空售票管理系统 高校会议室管理系统 高校就…

    Java 2023年6月8日
    0101
  • @FeignClient常用属性

    @FeignClient(name = "gateway-test", value = "gateway-test", url = &quo…

    Java 2023年6月5日
    089
  • 用Java实现生成图片验证码

    通过代码实现生成一个随机验证码图片,且生成后自动打开: package day_12_17; import javax.imageio.ImageIO; import java.a…

    Java 2023年6月7日
    071
  • java Math类

    java.lang.Math类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。类似这样的工具类,其所有方法均为静态方法,并且不会创建对象,调用起来非常简单 常用…

    Java 2023年5月29日
    081
  • Java并发杂谈(一):volatile的底层原理,从字节码到CPU

    volatile的特性 volatile是Java中用于修饰变量的关键字,其主要是保证了该变量的可见性以及顺序性,但是没有保证原子性;其是Java中最为轻量级的同步关键字;接下来我…

    Java 2023年6月7日
    094
  • 格式化的输出

    可以使用 System.out.print(s)将数值输出到控制台中; Java SE 5.0沿用了C语言库函数中的printf方法,例如: System.out.printf(“…

    Java 2023年6月9日
    077
  • 面向对象ooDay5

    默认的:什么也不写,本类、同包类 说明: java不建议默认访问权限 类的访问权限只能是public或默认的,类中成员的访问权限如上4种都可以 访问权限由小到大依次为:privat…

    Java 2023年6月13日
    080
  • TCP 5连问,你能抗到第几轮?

    1,TCP3次握手具体过程 2,请聊聊SYN攻击 3,CLOSE-WAIT 和 TIME-WAIT的作用 4,TCP如何保证可靠性 5,TCP如何进行拥塞控制 答案解析 ​ TCP…

    Java 2023年6月15日
    089
  • git 版本控制命令笔记

    git 获取与创建项目 你得先有一个git仓库,才能用它进行操作。仓库是Git存放你要保存的快照的地方。 创建仓库的两种方式: init 通过命令行初始化。 clone 如果我们想…

    Java 2023年6月8日
    088
  • java网络编程

    网络编程是指编写运行在计算机的程序,这些设备都通过网络连接起来。要实现网络通信,我们要考虑几个问题: 1.如何建立两个节点(电脑)之间的网络连接? 2.如何向另外一个节点(电脑)发…

    Java 2023年6月8日
    080
  • Redis学习笔记(一):Redis的数据类型

    之前笔者常常接触的数据库是关系型数据库,其中MySQL接触居多。近年来NoSQL兴起,各种新型数据库不断诞生,redis就是NoSQL中的一种热门数据库。 注:此类文章仅仅作为笔者…

    Java 2023年6月6日
    078
  • HTML基本标签

    1.文件开始标签 用于表示该文件是以 &#x8D85;&#x6587;&#x672C;&#x6807;&#x8BC6;&#x8BED…

    Java 2023年6月5日
    091
  • 关于非对称加密的一点解说

    非对称加密定义: 非对称加密算法又称 &#x73B0;&#x4EE3;&#x52A0;&#x5BC6;&#x7B97;&#x6CD5…

    Java 2023年6月16日
    0110
  • Java开发笔记(一百五十二)Date工具的时间格式

    Java开发经常要把当前时间转为字符串,比如”2020-07-08 22:59:48″这样,此时会用到格式化工具SimpleDateFormat,该工具通过…

    Java 2023年6月6日
    086
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球