排序 - 快速排序(Quick Sort)

news2024/11/26 0:42:07

文章目录

  • 快速排序介绍
  • 快速排序实现
  • 快速排序时间复杂度和稳定性
    • 快速排序稳定性
    • 快速排序时间复杂度
  • 代码实现
  • 核心&总结

快速排序介绍

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

快速排序实现

  • 从数列中挑出一个基准值。
  • 将所有比基准值小的摆放在基准前面,所有比基准值大的摆在基准的后面(相同的数可以到任一边);在这个分区退出之后,该基准就处于数列的中间位置。
  • 递归地把"基准值前面的子数列"和"基准值后面的子数列"进行排序。

下面以数列a={30,40,60,10,20,50}为例,演示它的快速排序过程(如下图)。

在这里插入图片描述

上图只是给出了第1趟快速排序的流程。在第1趟中,设置x=a[i],即x=30。

  • 从"右 --> 左"查找小于x的数: 找到满足条件的数a[j]=20,此时j=4;然后将a[j]赋值a[i],此时i=0;接着从左往右遍历。
  • 从"左 --> 右"查找大于x的数: 找到满足条件的数a[i]=40,此时i=1;然后将a[i]赋值a[j],此时j=4;接着从右往左遍历。
  • 从"右 --> 左"查找小于x的数: 找到满足条件的数a[j]=10,此时j=3;然后将a[j]赋值a[i],此时i=1;接着从左往右遍历。
  • 从"左 --> 右"查找大于x的数: 找到满足条件的数a[i]=60,此时i=2;然后将a[i]赋值a[j],此时j=3;接着从右往左遍历。
  • 从"右 --> 左"查找小于x的数: 没有找到满足条件的数。当i>=j时,停止查找;然后将x赋值给a[i]。此趟遍历结束!

按照同样的方法,对子数列进行递归遍历。最后得到有序数组!

快速排序时间复杂度和稳定性

快速排序稳定性

快速排序是不稳定的算法,它不满足稳定算法的定义。

算法稳定性 – 假设在数列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。则这个排序算法是稳定的!

快速排序时间复杂度

快速排序的时间复杂度在最坏情况下是O(N2),平均的时间复杂度是O(N*lgN)。

这句话很好理解: 假设被排序的数列中有N个数。遍历一次的时间复杂度是O(N),需要遍历多少次呢? 至少lg(N+1)次,最多N次。

  • 为什么最少是lg(N+1)次? 快速排序是采用的分治法进行遍历的,我们将它看作一棵二叉树,它需要遍历的次数就是二叉树的深度,而根据完全二叉树的定义,它的深度至少是lg(N+1)。因此,快速排序的遍历次数最少是lg(N+1)次。
  • 为什么最多是N次? 这个应该非常简单,还是将快速排序看作一棵二叉树,它的深度最大是N。因此,快读排序的遍历次数最多是N次。

代码实现


package com.zxn;

import java.util.Arrays;

/**
 * @author zxn
 * @ClassName QuickSort
 * @Description
 * @createTime 2023年04月25日 13:04:00
 */
public class QuickSort {
    public static void sort(int a[], int low, int hight) {
        int l, r, pivot,temp;
        if (low > hight) {
            return;
        }
        l = low;
        r = hight;
        pivot = a[low]; // 用子表的第一个记录做基准
        while (l < r) { 
            // 从表的两端交替向中间扫描
            while (l < r && a[r] >= pivot)
                r--;
            
            while (l < r && a[l] < pivot)
                l++;
            if (l<r){
                temp = a[r];
                a[r]=a[l];
                a[l]=temp;
            }
        }
        a[low] = a[l];
        a[l]=pivot;
        
        if (low<l){
            sort(a, low, r - 1); // 对低子表进行递归排序
        }
        if (r<hight) {
            sort(a, r + 1, hight); // 对高子表进行递归排序
        }

    }

    public static void quickSort(int a[]) {
        sort(a, 0, a.length - 1);
    }

    public static void main(String[] args) {

        int a[] = {59, 38, 65, 97, 76, 13, 27, 49};
        quickSort(a);
        System.out.println(Arrays.toString(a));
    }

}


核心&总结

  • 1、确认基准数
  • 2、确认左右指针退出条件
  • 3、确认while退出条件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/459812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用QToolButton和QStackedWidget的侧边栏(SideBar)的实现与实现原理解析

使用QToolButton和QStackedWidget的侧边栏&#xff08;SideBar&#xff09;的实现与实现原理解析 原文链接&#xff1a;https://blog.csdn.net/qq153471503/article/details/128528072 Demo下载&#xff1a;https://gitee.com/jhuangBTT/QtSideBar 1、简介 侧边栏是一个很常用…

ModStartBlog v7.2.0 暗黑模式,超级搜索,富文本升级

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场&#xff0c;后台一键快速安装会…

Spring Security Ldap 登录认证流程的源码梳理

一、通过请求Controller开始登录认证 通过authenticationManager调用authenticate()方法开始登录认证&#xff0c;因为authenticationManager是通过Bean注入&#xff0c;因为SecurityLdapConfig是继承的WebSecurityConfigurerAdapter类&#xff0c;所以authenticationManager的…

【Unity+MySQL】实现注册登录系统(封装版)

目录 1 MySQL封装2 用户注册、登录方法封装3 Unity交互 接着 上篇文章的注册登录系统&#xff0c;这篇文章将MySQL相关操作封装&#xff0c;在Unity交互脚本中直接调用封装的方法。 1 MySQL封装 编写一个DBConnector脚本&#xff0c;封装MySQL中常用的操作&#xff0c;如连接…

【已解决】SpringBoot 工程 war包服务部署与调用测试

1.开发环境&#xff1a;IDEA&#xff0c;JDK1.8 2.服务打包类型&#xff1a; war包 3.war包部署环境&#xff1a;Linux系统&#xff0c;tomcat服务器&#xff0c;端口号&#xff1a;8081 4.war包部署位置&#xff1a;tomcat-8081/webapps/temp.war 5.服务名为&#xff1a;t…

Java版本企业电子招投标采购系统源码——功能模块功能描述+数字化采购管理 采购招投标

功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外部供…

Postman轻松签名,让SHA256withRSA保驾护航!

postman接口签名教程&#xff1a;https://www.bilibili.com/video/BV1r14y1A7MQ/? 目录&#xff1a;导读 前言 获取pmlib 引入依赖bundle.js&#xff0c;有以下两种方式&#xff1a; 使用Pre-request Script对请求进行加签(具体加签字段请看自己项目) 结语 前言 在接口测…

荔枝派Zero(全志V3S)开启alsa,测试codec

文章目录 前言一、ALSA 简介二、ALSA 框架三、buildroot 配置四、烧录到 SD 卡五、测试1、查看 CODEC 设备2、alsa-utils 使用①、查看设备②、调节音量③、查看控制器④、录音测试⑤、播放测试 前言 默认 dts 中使能了 codec 需要使用的话&#xff0c;在 buildroot 中勾选 a…

2023年五月份图形化四级打卡试题

活动时间 从2023年5月1日至5月21日&#xff0c;每天一道编程题。 本次打卡的规则如下&#xff1a; 小朋友每天利用10~15分钟做一道编程题&#xff0c;遇到问题就来群内讨论&#xff0c;我来给大家答疑。 小朋友做完题目后&#xff0c;截图到朋友圈打卡并把打卡的截图发到活动群…

开放式耳机有什么好处,盘点几款性能不错的开放式耳机

随着人们对生活质量要求的提高&#xff0c;大家在运动的时候都喜欢戴上耳机&#xff0c;享受运动的乐趣。但是传统耳机戴久了之后就会出现耳朵酸痛的情况&#xff0c;这是因为传统耳机佩戴方式是通过空气振动来传递声音&#xff0c;而人在运动时就会伴随着大量的汗水&#xff0…

基于ResNet-attention的负荷预测

一、attention机制 注意力模型最近几年在深度学习各个领域被广泛使用&#xff0c;无论是图像处理、语音识别还是自然语言处理的各种不同类型的任务中&#xff0c;都很容易遇到注意力模型的身影。从注意力模型的命名方式看&#xff0c;很明显其借鉴了人类的注意力机制。我们来看…

GB/T28181-2022相对2016版“基于TCP协议的视音频媒体传输要求“规范解读和技术实现

规范解读 GB/T28181-2022和GB/T28181-2016规范&#xff0c;有这么一条“更改了附录 D 基于 TCP 协议的视音频媒体传输要求&#xff08;见附录 D&#xff0c;2016 年版的附录 L&#xff09;。”。 本文主要是针对GB/T28181-2022里面提到的“基于 TCP 协议的视音频媒体传输要求…

chmod 命令 (chmod 0660)

chmod的作用: 用于设置文件所有者和文件关联组的命令,就是控制用户的权限命令 注意事项: chown 需要超级用户 root 的权限才能执行此命令。 自己常用chmod 命令是 chmod 777 * 给所有文件权限 chmod 777 文件名 给单独文件权限 这个777 是怎么来的, 或者chmod 0660 这…

Servlet路径问题(“/“到底代表什么)-“web应用程序的根目录“与“web站点的根目录“

JavaWeb——Servlet路径问题("/"到底代表什么) JavaWeb——Servlet路径问题("/"到底代表什么) 在JavaWeb中&#xff0c;使用路径时出现了大量的"/“&#xff0c;而每次使用”“时都感觉其代表的含义是不同的&#xff0c;因此&#xff0c;本篇文章将汇…

分布式ID解决方案对比

在复杂的分布式系统中&#xff0c;往往需要对大量的数据进行唯一标识&#xff0c;比如在对一个订单表进行了分库分表操作&#xff0c;这时候数据库的自增ID显然不能作为某个订单的唯一标识。除此之外还有其他分布式场景对分布式ID的一些要求&#xff1a; 趋势递增&#xff1a; …

(栈和队列) 232. 用栈实现队列 ——【Leetcode每日一题】

❓232. 用栈实现队列 难度&#xff1a;中等 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾int pop() 从队列…

Jenkins之allure测试报告邮件通知

Jenkins入门教程&#xff1a;Jenkins入门 一般情况下&#xff0c;我们想让Jenkins将构建结果或构建中的代码执行结果&#xff08;比如跑批数据&#xff09;通知我们&#xff0c;这个是构建后的操作。 经常用的是邮件通知 邮件通知基础 Jenkins自带了邮件通知配置&#xff0c…

灌区信息化和灌区自动化监测方案

一、方案背景 以提升粮食综合生产能力和水资源高效利用作为现代化改造的目标&#xff0c;把国家粮食安全和节水放在首位&#xff1b;以完善灌区工程设施体系和管理体系作为现代化改造的基础&#xff0c;以现代信息技术应用、智慧灌区建设作为提高管理能力和服务水平的手段&…

windows 文件夹目录过长超过长度259字符 文件打不开

当路径超过260个字符时&#xff0c;Windows操作系统就无法处理文件或文件夹&#xff0c;并且无法打开或重命名。这是因为Windows系统使用的文件系统&#xff0c;即FAT和NTFS文件系统&#xff0c;都有最大路径限制。NTFS文件系统最大长度限制为32767个字符&#xff0c;但操作系统…

算法训练day4:栈与队列

那么我这里再列出四个关于栈的问题&#xff0c;大家可以思考一下。以下是以C为例&#xff0c;使用其他编程语言的同学也对应思考一下&#xff0c;自己使用的编程语言里栈和队列是什么样的。 C中stack 是容器么&#xff1f;我们使用的stack是属于哪个版本的STL&#xff1f;我们…