【排序】快速排序

2023-10-29

思路分析

快速排序采用双向查找的策略,每一趟选择当前所有子序列中的一个关键字作为枢纽轴,将子序列中比枢纽轴小的前移,比枢纽轴大的后移,当本趟所有子序列都被枢轴按上述规则划分完毕后将会得到新的一组更短的子序列,他们将成为下趟划分的初始序列集。

时间复杂度:最好情况(待排序列接近无序)时间复杂度为O(nlog2n),最坏情况(待排序列接近有序)时间复杂度为O(n2),平均时间复杂度为O(nlog2n)。

PS:属于选择排序之一(另外一种是堆排序)

快速排序(Quick Sort)

快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

算法描述

快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:

  • 从数列中挑出一个元素,称为 “基准”(pivot);
  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
  • 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

动图演示



代码实现


 

public class QuickSort {
    public int partition(int[] sortArray, int low, int height) {
        int key = sortArray[low]; // 刚开始以第一个数为标志数据
        while (low < height) {
            while (low < height && sortArray[height] >= key)
                height--;         // 从后面开始找,找到比key值小的数为止
            sortArray[low] = sortArray[height];// 将该数放到key值的左边
            while (low < height && sortArray[low] <= key)
                low++;              // 从前面开始找,找到比key值大的数为止
            sortArray[height] = sortArray[low]; // 将该数放到key值的右边
        }
        sortArray[low] = key;   // 把key值填充到low位置,下次重新找key值
        // 打印每次排序结果
        for (int i = 0; i <= sortArray.length - 1; i++) {
            System.out.print(sortArray[i] + "\t");
        }
        System.out.println();
        return low;
    }

    public void sort(int[] sortArray, int low, int height) {
        if (low < height) {
            int result = partition(sortArray, low, height);
            sort(sortArray, low, result - 1);
            sort(sortArray, result + 1, height);
        }
    }

    public static void main(String[] args) {
        QuickSort quickSort = new QuickSort();
        int[] array = {5, 69, 12, 3, 56, 789, 2, 5648, 23};
        for (int i = 0; i <= array.length - 1; i++) {
            System.out.print(array[i] + "\t");
        }
        System.out.println();
        quickSort.sort(array, 0, 8);
        for (int i = 0; i <= array.length - 1; i++) {
            System.out.print(array[i] + "\t");
        }
    }
}

算法分析

最佳情况:T(n) = O(nlogn)   最差情况:T(n) = O(n2)   平均情况:T(n) = O(nlogn) 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【排序】快速排序 的相关文章

随机推荐

  • 断言(Assert)的用法

    一 概念 编写代码时 我们总是会做出一些假设 断言就是用于在代码中捕捉这些假设 可以将断言看作是异常处理的一种高级形式 使用断言可以创建更稳定 品质更好且不易于出错的代码 当需要在一个值为FALSE时中断当前操作的话 可以使用断言 单元测试
  • 二进制间距

    二进制间距 给定一个正整数 n 找到并返回 n 的二进制表示中两个 相邻 1 之间的 最长距离 如果不存在两个相邻的 1 返回 0 如果只有 0 将两个 1 分隔开 可能不存在 0 则认为这两个 1 彼此 相邻 两个 1 之间的距离是它们的
  • MySQL创建S,P,J,SPJ表,以及SQL语句

    MySQL创建S P J SPJ表 CREATE TABLE S SNO char 9 primary key SNAME char 9 STATUS char 9 CITY char 9 CREATE TABLE P PNO char 9
  • Linux休眠,挂起,待机,关机的区别及相关命令

    转 http blog 163 com kukwkukw 126 blog static 97095900201410672425693 体眠是一种更加省电的模式 它将内存中的数据保存于硬盘中 所有设备都停止工作 当再次使用时需按开关机键
  • 一文读懂深度学习框架下的目标检测(附数据集)

    从简单的图像分类到3D位置估算 在机器视觉领域里从来都不乏有趣的问题 其中我们最感兴趣的问题之一就是目标检测 如同其他的机器视觉问题一样 目标检测目前为止还没有公认最好的解决方法 在了解目标检测之前 让我们先快速地了解一下这个领域里普遍存在
  • 整理的最全 python常见面试题(基本必考)① ②③④⑤⑥⑦⑧⑨⑩

    1 大数据的文件读取 利用生成器generator 迭代器进行迭代遍历 for line in file 2 迭代器和生成器的区别 答 1 迭代器是一个更抽象的概念 任何对象 如果它的类有next方法和iter方法返回自己本身 对于stri
  • Vim进阶

    Vim实用技术 第1部分 实用技巧 http www ibm com developerworks cn linux l tip vim1 index html Vim实用技术 第2部分 常用插件 http www ibm com deve
  • 软件测试13个最容易犯的错误

    目录 一 输入框测试 二 搜索功能测试 三 添加 修改功能 四 删除功能 五 上传图片功能测试 六 查询结果列表 七 返回键检查 八 回车键检查 九 刷新键检查 十 直接URL链接检查 盗链问题 十一 并发问题 十二 业务流程测试 十三 界
  • nvme分区选mbr还是guid_Linux 扩容 / 根分区(LVM+非LVM)

    目录 1 概述 2 CentOS7 LVM根分区扩容步骤 3 CentOS7 非LVM根分区扩容步骤 一 背景 概述 MBR Master Boot Record 主引导记录 和GPT GUID Partition Table GUID意为
  • 和泉纱雾

    和泉纱雾 Time Limit 1000 ms Memory Limit 65536 KiB Submit Statistic Problem Description 众所周知 和泉纱雾是著名的埃罗芒阿老师 画画功力首屈一指 今天我们的埃罗
  • 长度大小为零的数组(柔性数组、可变数组)

    书山有路勤为径 学海无涯苦作舟 目录 前言 一 什么是柔性数组 二 柔性数组应用及优势对比 1 定长数组 2 指针域 3 柔性数组 总结 前言 柔性数组 Arrays of Length Zero 是GNU GCC在C C 标准下扩展而引出
  • 网络测速命令

    linux命令行测速 https blog 51cto com 13718210 2418661
  • C语言课程设计-工资管理系统

    前言 这个程序是博主在大学第一个学期学完C语言后的课程设计 那时刚从一个小白变得会一点点编程 老师就布置了这个课程设计 当时一脸懵这是啥 我在哪 我要干什么 但是通过查阅了很多资料以及问了许多人以后 我逐渐开始写我的第一个项目 现在来看这个
  • opencv_gpu加速环境配置教程问题汇总

    1 安装CUDA 1 1 安装的cuda版本与英伟达驱动中的版本必须是一致的 1 2 安装的cuda后必须把cuda的环境配置到系统的环境变量中 1 3 检查cuda安装的版本与英伟达版本是不是一致的 cmd中输入 nvcc V 2 安装o
  • IDEA 怎么自定义代码模板?

    打开idea gt File gt Settings 点击 Editor gt Live Templates 添加组名或组的变量名 输入自己定义的变量名 即可输出代码 点击 Edit variables Expression改为与自己代码需
  • 使用sersync实现数据实时同步

    使用sersync实现数据实时同步 sersync诞生过程 部署前提 配置rsync服务端 部署sersync 配置sersync的path变量 修改sersync配置文件 sersync常用参数 使用服务文件实现开机自启动 实时同步服务d
  • vue中postcss怎么配置

    主要是 postcssrc js中的配置 在进入主题之前先记录下node中读取文件路径的问题 node js中的文件路径主要是包括 dirname filename process cwd 等 前面三个是绝对路径 后面是相对路径 当然你可以
  • Java API之Calendar(日历)类[详解]

    Calendar 日历 类 一 Calendar概述 位于java util Caleandar包中 是一个抽象基类 用于完成日期字段之间相互转换的功能 由于是抽象类型 因此不可直接实例化 不能new 对象 一个Caleandar类的实例是
  • CSS简介

    CSS简介 什么是CSS CSS 是层叠样式表 Cascading Style Sheets 的简称 有时我们也会称之为 CSS 样式表或级联样式表 CSS 是也是一种标记语言 CSS 主要用于设置 HTML 页面中的文本内容 字体 大小
  • 【排序】快速排序

    思路分析 快速排序采用双向查找的策略 每一趟选择当前所有子序列中的一个关键字作为枢纽轴 将子序列中比枢纽轴小的前移 比枢纽轴大的后移 当本趟所有子序列都被枢轴按上述规则划分完毕后将会得到新的一组更短的子序列 他们将成为下趟划分的初始序列集