1. 快排的思想

  通过一趟排序将要排序的数据分割成独立的两部分,前一部分的所有数据都要小于后一部分的所有数据,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据的有序性。

2. 快排实现的核心步骤

  ①找基准点:一般是数组的第一个元素来充当;

  ②right:从数组的最后一个元素开始,从右往左,直到找到小于基准点的元素;每次都要right比left先走;

  ③left:从数组的第一个元素开始,从左往右,直到找到大于基准点的元素;

  ④交换 left 和 right 所在位置的两个元素;

  ⑥right 继续往左走,找到小于基准点的元素;left 继续往右走,找到大于基准点的元素;然后 left 和 right 再做交换;循环往复,直到两人相遇;

  ⑦将相遇点所在位置的元素和基准点所在位置的元素做交换,基准点到了中间位置(此时基准点左边的元素全都小于基准点右边的元素);

  ⑧【递归】将基准点左边的所有元素当成一个数组,重复①~⑦步骤;基准点右边的所有元素也是如此;

3. 快排的java代码实现

 public class A01QuickSort {
  public static void main(String[] args) {
    A01QuickSort quickSort = new A01QuickSort();     // 测试快排的效率:
    // int number = 1000000;
    // int[] array = new int[number];
    // for (int i = 0; i < array.length; i++) {
    // array[i] = new Random().nextInt(number);
    // }     //配合后面的元素输出,测试快排是否排序准确:
    int[] array = new int[] {181,181,187,181};
    System.out.println("数组准备完毕~");     long start = System.currentTimeMillis();
    quickSort.quickSort(array, 0, array.length - 1);
    long end = System.currentTimeMillis();
    System.out.println("quickSort 用时:" + (end - start));// 测试结果: 元素为5万个时:11毫秒。50万:66毫秒。100万:136毫秒     //遍历输出数组元素:
    quickSort.traverseArray(array);
  }   /**
  * 快排的实现
  * @param target
  * @param left
  * @param right
  */
  public void quickSort(int[] target, int left, int right) {
    if (left >= right) {
      return;
    }
    int pivot = target[left];// 基准点
    int temp;
    int i = left;
    int j = right;//为什么要声明i和j,因为后面做迭代的时候还需要用到最初的left和right
    while (i < j) {//验证array数组至少有2个元素,才要做排序
      /**
      * 提问:
      * 为什么是 while里的判断,为什么是 “target[j] >= pivot”,而不是“target[j] > pivot”???
      * 答: 数组[181,181,187,181],分别用上面两种while去测试:
      * 如果是">="时,因为 181 >= 181 成立,所以right就会从右往左移;
      * 如果是">"时,因为 181 > 181 成立,所以right就不会左移。
      * 重点!!!right或left,必须有一方得是移动的!!!否则程序就会进入死循环!!!
      */
      // 如果right一直都大于或等于pivot,则继续走,直到找到比pivot小的:
      while (target[j] >= pivot && i < j) {
        j--;
      }
      // 如果left一直都小于等于pivot,则继续走,直到找到比pivot大的:
      while (target[i] <= pivot && i < j) {
        i++;
      }
      // 此时right < pivot, left > pivot,将i和j做交换:
      if (i < j) {//这里做判断是为了right到了left位置时,不用再将执行下面这三行代码了:
        temp = target[i];
        target[i] = target[j];
        target[j] = temp;
      }
    }
    // left和right相遇了:
    // ①将相遇点的元素和pivot做交换:
    target[left] = target[j];
    target[j] = pivot;
    // ②基准点两边的元素的分别再做排序:
    quickSort(target, left, j - 1);
    quickSort(target, j + 1, right);
  }   //遍历数组
  public void traverseArray(int[] array) {
    for(int element : array) {
      System.out.println(element);
    }
  }
}

4. 快排的时间复杂度:O(n * log(n))

  快排的时间复杂度分析:快排的时间复杂度分析(含图解)

快排的java实现方式,用java代码来实现快排的更多相关文章

  1. 【转】几种Java序列化方式的实现

    0.前言 本文主要对几种常见Java序列化方式进行实现.包括Java原生以流的方法进行的序列化.Json序列化.FastJson序列化.Protobuff序列化. 1.Java原生序列化 Java原生 ...

  2. 《Java知识应用》Java加密方式(Base64)详解

    1. 说明 Base64加密方式:比较简单,加密快,对普通大众可以起到加密的作用.在程序员眼中和透明一样. Base64应用场景:图片转码(应用于邮件,img标签,http加密) 2. 案例 impo ...

  3. 【第一期百题计划进行中,快来打卡学习】吃透java、细化到知识点的练习题及笔试题,助你轻松搞定java

    [快来免费打卡学习]参与方式 本期百题计划开始时间:2022-02-09,今日打卡题已在文中标红. 0.本文文末评论区打卡,需要登录才可以打卡以及查看其他人的打卡记录 1.以下练习题,请用对应的知识点 ...

  4. 两种方式实现java生成Excel

    Web应用中难免会遇到需要将数据导出并生成excel文件的需求.同样,对于本博客中的总结,也是建立在为了完成这样的一个需求,才开始去了解其实现形式,并且顺利完成需求的开发,先将实现过程总结于此.本博文 ...

  5. Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结

    最近老是遇见服务器内存溢出的问题,故在网上搜了搜,总结了一些java内存溢出的解决方式 java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生该错误的原因大都 ...

  6. java 22 - 9 多线程之 代码实现的方式2

    多线程的代码实现: 方式2:实现Runnable接口 步骤: A:自定义类MyRunnable实现Runnable接口 B:重写run()方法 C:创建MyRunnable类的对象 D:创建Threa ...

  7. paip.提高效率---集合的存取括号方式 uapi java python php js 的实现比较

    paip.提高效率---集合的存取括号方式 uapi java python php js 的实现比较 ##java ----------- 在JDK1.7中,摒弃了Java集合接口的实现类,如:Ar ...

  8. Java中基本数据类型的存储方式和相关内存的处理方式(java程序员必读经典)

    1.java是如何管理内存的 java的内存管理就是对象的分配和释放问题.(其中包括两部分) 分配:内存的分配是由程序完成的,程序员需要通过关键字new为每个对象申请内存空间(基本类型除外),所有的对 ...

  9. Centos中yum方式安装java

    查看CentOS自带JDK是否已安装.◆输入:yum list installed |grep java. 若有自带安装的JDK,如何卸载CentOS系统自带Java环境?◆卸载JDK相关文件输入:y ...

  10. 3种方式实现Java多线程

    java中实现多线程的方法有两种:继承Thread类和实现runnable接口. 1.继承Thread类,重写父类run()方法 public class thread1 extends Thread ...

随机推荐

  1. 学习笔记之知识图谱 (Knowledge Graph)

    Knowledge Graph - Wikipedia https://en.wikipedia.org/wiki/Knowledge_Graph The Knowledge Graph is a k ...

  2. ES6 函数的拓展(四)

    一.参数带默认值函数1.在函数形参可以赋予函数默认值[即实参严格匹配undefined时,在函数内部使用形参时调用它的默认值]2.函数name属性 [返回函数名称,无名的函数返回空字符串]3.函数le ...

  3. QGraphicsItem鼠标精准拾取(pick/select)研究

    在QT场景视图中,一个2D图形项是一个QGraphicsItem,我们可以通过继承来定义我们自己的图形项. 主要有以下三个虚函数需要重点关注: 1)   边界矩形(必须实现) virtual QRec ...

  4. UIPickerView基本使用

    UIPickerView是很常用的一个UI控件,在各种购物平台选择地址时候都是必备的,下面我们来说一下具体的使用 首先UIPickerView的创建,与多数控件一样,分配内存并设置位置尺寸. 重要的的 ...

  5. ffmpeg 基本数据结构和对象(一): AVPacket、AVPicture、AVFrame

    来源:http://blog.csdn.net/chance_yin/article/details/16817957 一.AVPacket /** * AVPacket 作为解码器的输入 或 编码器 ...

  6. 【爬虫】网页抓包工具--Fiddler--Request和Response

    [爬虫]网页抓包工具--Fiddler Fiddler基础知识 Fiddler是强大的抓包工具,它的原理是以web代理服务器的形式进行工作的,使用的代理地址是:127.0.0.1,端口默认为8888, ...

  7. using 中写 return 一样会释放using 中对象 但是会在外面定义一个一样的对象 赋值后 释放 最后 return 外面定义的那个对象

    static DataTable getDataTable() { ")) { SqlCommand com = new SqlCommand("", con); Sql ...

  8. Java的自动拆装箱与Integer的缓存机制

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10832303.html 一:基本类型与包装类型     我们知道,Java有8大基本数据类型,4整2浮1符1 ...

  9. sftp常用命令

    help 查看sftp支持哪些命令 ls  查看当前目录下文件 cd 指定目录 lcd 更改和/或打印本地工作目录 pwd 查看当前目录 lpwd 打印本地工作目录 get xxx.txt 下载xxx ...

  10. 【JSTL】JSTL标签库的常用标签

    一.JSTL技术 1.JSTL概述 JSTL(JSP Standard Tag Library),JSP标准标签库,可以嵌入在jsp页面中使用标签的形式完成业务逻辑等功能.jstl出现的目的同el一样 ...