排序:Java实现快速排序原理及代码注释详解

简介: 排序:Java实现快速排序原理及代码注释详解

快速排序


1.简介:


快速排序是对冒泡排序的一种改进。它的最坏时间复杂度为O(n2),最好时间复杂度为O(nlogn),平均时间复杂度为O(nlogn),它是不稳定排序。


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


2.算法原理:


从数列中挑出一个元素,称为 “基准”;

重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区操作;

递归地把小于基准值元素的子数列和大于基准值元素的子数列排序。

结合动态图理解一下:

20190715215152724.gif



(图片来源:十大经典排序算法(动图演示)

3.代码实现:

public static void kuaiSu(int[] a,int low,int height){
        int i = low,j = height;
        if(low < height){
            int mark = a[low];
            while (i < j) {
                while (a[j] > mark && i < j){
                    j--;
                }
                if(i < j) {
                    a[i] = a[j];
                    i++;
                }
                while (a[i] < mark && i < j){
                    i++;
                }
                if(i < j) {
                    a[j] = a[i];
                    j--;
                }
            }
            a[i] = mark;
            kuaiSu(a,low,i - 1);
            kuaiSu(a,i+1,height);
        }
    }


测试一波:

package sort;
/**
 * @author yzh
 * @date 2019-07-15 20:36
 */
public class KuaiSu {
    public static void kuaiSu(int[] a,int low,int height){
        int i = low,j = height;
        if(low < height){
            int mark = a[low];
            while (i < j) {
                while (a[j] > mark && i < j){
                    j--;
                }
                if(i < j) {
                    a[i] = a[j];
                    i++;
                }
                while (a[i] < mark && i < j){
                    i++;
                }
                if(i < j) {
                    a[j] = a[i];
                    j--;
                }
            }
            a[i] = mark;
            kuaiSu(a,low,i - 1);
            kuaiSu(a,i+1,height);
        }
    }
    public static void main(String[] args) {
        int[] a = {4,-4,52,0,54,14,754};
        kuaiSu(a,0,a.length-1);
        for(int i = 0;i < a.length;i++){
            System.out.println(a[i]);
        }
    }
}

测试结果:


20190715215803858.png

4.优缺点:

  • 优点:极快,数据移动少;
  • 缺点:不稳定。
目录
相关文章
|
10天前
|
Java 程序员
Java 排序神器:Comparable 和 Comparator 该怎么选?
嗨,大家好,我是小米!今天和大家聊一聊Java社招面试中常考的经典问题——Comparable和Comparator的区别。Comparable定义对象的自然排序,适用于单一固定的排序规则;Comparator则是策略接口,用于定义自定义排序规则,适用于多样化或多变的排序需求。掌握这两者的区别是理解Java排序机制的基础,也是面试中的加分题。结合实际项目场景深入探讨它们的应用,能更好地打动面试官。如果你觉得有帮助,欢迎点赞、收藏、分享,期待你的一键三连!我们下期见~ 我是小米,一个喜欢分享技术的程序员,关注我的微信公众号“软件求生”,获取更多技术干货!
40 20
|
26天前
|
监控 Java API
探索Java NIO:究竟在哪些领域能大显身手?揭秘原理、应用场景与官方示例代码
Java NIO(New IO)自Java SE 1.4引入,提供比传统IO更高效、灵活的操作,支持非阻塞IO和选择器特性,适用于高并发、高吞吐量场景。NIO的核心概念包括通道(Channel)、缓冲区(Buffer)和选择器(Selector),能实现多路复用和异步操作。其应用场景涵盖网络通信、文件操作、进程间通信及数据库操作等。NIO的优势在于提高并发性和性能,简化编程;但学习成本较高,且与传统IO存在不兼容性。尽管如此,NIO在构建高性能框架如Netty、Mina和Jetty中仍广泛应用。
37 3
|
26天前
|
安全 算法 Java
Java CAS原理和应用场景大揭秘:你掌握了吗?
CAS(Compare and Swap)是一种乐观锁机制,通过硬件指令实现原子操作,确保多线程环境下对共享变量的安全访问。它避免了传统互斥锁的性能开销和线程阻塞问题。CAS操作包含三个步骤:获取期望值、比较当前值与期望值是否相等、若相等则更新为新值。CAS广泛应用于高并发场景,如数据库事务、分布式锁、无锁数据结构等,但需注意ABA问题。Java中常用`java.util.concurrent.atomic`包下的类支持CAS操作。
62 2
|
2月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
2月前
|
Java
Java之CountDownLatch原理浅析
本文介绍了Java并发工具类`CountDownLatch`的使用方法、原理及其与`Thread.join()`的区别。`CountDownLatch`通过构造函数接收一个整数参数作为计数器,调用`countDown`方法减少计数,`await`方法会阻塞当前线程,直到计数为零。文章还详细解析了其内部机制,包括初始化、`countDown`和`await`方法的工作原理,并给出了一个游戏加载场景的示例代码。
Java之CountDownLatch原理浅析
|
2月前
|
Java 索引 容器
Java ArrayList扩容的原理
Java 的 `ArrayList` 是基于数组实现的动态集合。初始时,`ArrayList` 底层创建一个空数组 `elementData`,并设置 `size` 为 0。当首次添加元素时,会调用 `grow` 方法将数组扩容至默认容量 10。之后每次添加元素时,如果当前数组已满,则会再次调用 `grow` 方法进行扩容。扩容规则为:首次扩容至 10,后续扩容至原数组长度的 1.5 倍或根据实际需求扩容。例如,当需要一次性添加 100 个元素时,会直接扩容至 110 而不是 15。
Java ArrayList扩容的原理
|
1月前
|
Java
Java 中的注释
1. 单行注释:// 2. 多行注释:/* */ 3. 文档注释::/** **/
|
8月前
|
Java
使用Java代码打印log日志
使用Java代码打印log日志
331 1
|
Java BI API
在Java代码中打日志需要注意什么?
日志是什么?日志是你在代码运行时打印出来的一些数据和记录,是快速排查问题的好帮手,是撕逼和甩锅的利器!
721 0
|
缓存 Java 网络架构
别在 Java 代码里乱打日志了,这才是正确的打日志姿势!
别在 Java 代码里乱打日志了,这才是正确的打日志姿势!
173 0