快速排序基本原理

news2024/12/23 2:29:02

快速排序基本原理

  • 1.快速排序
    • 1.1 基本原理
    • 1.2 快速排序执行步骤
      • 1.2.1 分区包含步骤
      • 1.2.1 分区步骤
    • 1.3 快速排序大O记法表示
  • 2. 将[0,5,2,1,6,3]进行快速排序 【实战】
    • 2.1 第一次分区步骤
    • 2.2 第二次分区步骤
    • 2.3 第三次分区步骤
    • 2.4 第四次分区步骤
  • 3.快速排序代码实现

1.快速排序

1.1 基本原理

  • 快速排序依赖于一个名为分区的概念
  • 分区:从数组随机选取一个值,以此值轴,将比它小的值放到它左边,比它大的值放到它右边

1.2 快速排序执行步骤

1.2.1 分区包含步骤

  • 比较:每个值都要与轴做比较。
  • 交换:在适当时候将左右指针所指的两个值交换位置。

1.2.1 分区步骤

  • 第一次分区步骤

    1. 左指针逐个格子向右移动,当遇到大于或等于轴的值时,停止移动。
    2. 右指针逐个格子向左移动,当遇到小于或等于轴的值时,停止移动。
    3. 将两指针所指的值交换位置。
    4. 重复步骤,直至两指针重合或左指针移到右指针的右边。
    5. 将轴与左指针所指的值交换位置【左指针>轴时交换】。
  • 子数组分区
    6. 对其轴左右两侧的元素进行排序。
    7. 对轴左右的两个子数组递归重复第 1、2 步,两个子数组各自分区,并形成各自的轴以及由轴分隔的更小的子数组。然后对这些子数组分区。
    8. 当分出的子数组长度为 0 或 1 时,排序结束。

  • 每次分区完成时,在轴左侧的那些值肯定比轴要小,在轴右侧的那些值肯定比轴要大

  • 轴数据的值放在了正确的位置。

1.3 快速排序大O记法表示

  • 快速排序大O记法表示: O( N N N)

2. 将[0,5,2,1,6,3]进行快速排序 【实战】

2.1 第一次分区步骤

在这里插入图片描述

2.2 第二次分区步骤

在这里插入图片描述

2.3 第三次分区步骤

在这里插入图片描述

2.4 第四次分区步骤

在这里插入图片描述

3.快速排序代码实现

# 方式一【有排序步骤输出】,根据最大索引排序
alist = [6, 1, 2, 7, 9, 3, 4, 5, 10, 8]
def sort(alist, left, right, flag=True):
    if not flag:
        print('-' * 30 + '\tstart list\t' + '-' * 30)
    print(f"当前列表为:{alist},left:{left},right:{right}")
    axis_index = right
    axis = alist[axis_index]  # 轴值
    left_pointer = left  # 左指针
    right_pointer = right - 1  # 右指针
    if left_pointer > right_pointer:  # 判断左指针是否在右指针的右边,如果是:停止移动
        return
    while True:
        while alist[left_pointer] < axis:
            left_pointer = left_pointer + 1
        while alist[right_pointer] > axis:  # 右指针向左移动
            right_pointer = right_pointer - 1
        if left_pointer < right_pointer:  # 指针未重合
            alist[left_pointer], alist[right_pointer] = alist[right_pointer], alist[left_pointer]
            print(f'左指针索引为:{left_pointer},右指针索引为:{right_pointer};左右指针交换后数组作为:{alist}')
        elif alist[left_pointer] > alist[axis_index]:
            alist[left_pointer], alist[axis_index] = alist[axis_index], alist[left_pointer]  # 轴值交换
            print(f'左指针索引为:{left_pointer},轴索引为:{axis_index};左指针与轴交换后数组作为:{alist}')
            break
        elif left_pointer > right_pointer:
            print(f"左指针索引为:{left_pointer},右指针索引为:{right_pointer};左指针在右指针的右边,指针移动结束")
            break
    print(f'分区结束,数组为:{alist}')

    if left_pointer - left not in [0, 1]:
        print('-' * 30 + '\tleft list\t' + '-' * 30)
        sort(alist, left, left_pointer - 1)  # 排序左子数组
    if right - left_pointer not in [0, 1]:
        print('-' * 30 + '\tright list\t' + '-' * 30)
        sort(alist, left_pointer + 1, right)  # 排序右子数组
    return alist


end=sort(alist, 0, len(alist) - 1, False)
print('-' * 30 + '\tend list\t' + '-' * 30)
print(f"最终排序结果为:{end}")

# 方式二【无排序步骤输出】
alist = [6, 1, 2, 7, 9, 3, 4, 5, 10, 8]
def sort(alist, left, right):
    axis_index = right        # 轴索引
    axis = alist[axis_index]  # 轴值
    left_pointer = left  # 左指针
    right_pointer = right - 1  # 右指针
    if left_pointer > right_pointer:  # 判断左指针是否在右指针的右边,如果是:停止移动
        return
    while True:
        while alist[left_pointer] < axis:  # 左指针向右移动
            left_pointer = left_pointer + 1
        while alist[right_pointer] > axis:  # 右指针向左移动
            right_pointer = right_pointer - 1
        if left_pointer < right_pointer:  # 指针未重合,左右指针调换
            alist[left_pointer], alist[right_pointer] = alist[right_pointer], alist[left_pointer]
        elif alist[left_pointer] > alist[axis_index]: # 左指针>轴
            alist[left_pointer], alist[axis_index] = alist[axis_index], alist[left_pointer]  # 轴值交换
            break
        elif left_pointer > right_pointer:  # 左指针在右指针的右边
            break
    if left_pointer - left not in [0, 1]:
        sort(alist, left, left_pointer - 1)  # 排序左子数组
    if right - left_pointer not in [0, 1]:
        sort(alist, left_pointer + 1, right)  # 排序右子数组
    return alist
end=sort(alist, 0, len(alist) - 1)
print(f"最终排序结果为:{end}")

# 方式三 :根据索引0开始排序
alist = [6, 1, 2, 7, 9, 3, 4, 5, 10, 8]
def sort(alist, left, right):
    low = left
    high = right
    if low > high:
        return
    middle = alist[low]
    while low != high:
        while low < high:
            if alist[high] > middle:
                high = high - 1
            else:
                alist[low] = alist[high]
                break
        while low < high:
            if alist[low] < middle:
                low = low+1
            else:
                alist[high] = alist[low]
                break
    alist[low] = middle
    sort(alist, left, low - 1)
    sort(alist, high + 1, right)
    return alist


print(sort(alist, 0, len(alist) - 1))

在这里插入图片描述

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

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

相关文章

一文盘点,ZBC的应用场景与通缩场景

进入到2023年&#xff0c;Zebec生态正在向新的叙事方向发展。一方面我们看到&#xff0c;流支付生态Zebec在此前正式走向DAO&#xff0c;并上线了DAO治理投票平台Zebec Node&#xff0c;任何持有ZBC的用户都可以参与投票。另一方面我们看到生态正在朝着最初的愿景迸发&#xff…

3.28 haas506 2.0开发教程-example-蓝牙多设备扫描(仅支持M320,HD1)

haas506 2.0开发教程-example-蓝牙多设备扫描案例说明蓝牙信息克隆1.手机蓝牙改名信息克隆代码测试案例说明 开发板扫描蓝牙设备&#xff0c;获取并打印蓝牙设备mac地址。mac地址每个设备不同&#xff0c;且不能更改。本案例仅适用于M320开发板和HD1-RTU。案例使用手机与iBeac…

LeetCode(剑指offer) Day1

1.用两个栈实现一个队列。队列的声明如下&#xff0c;请实现它的两个函数 appendTail 和 deleteHead &#xff0c;分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素&#xff0c;deleteHead 操作返回 -1 ) 解题过程记录&#xff1a;本题就是用两个栈&…

如何激励你的内容团队产出更好的创意

对于一个品牌而言&#xff0c;如何创造吸引受众并对受众有价值内容是十分关键的。随着市场数字化的推进&#xff0c;优质的创意和内容输出对一个品牌在市场中有着深远的影响。对于很多内容策划和创作者来说&#xff0c;不断地产出高质量有创意的内容是一件非常有挑战性的事情。…

【零基础入门前端系列】—超链接和文本格式化标签(四)

【零基础入门前端系列】—超链接和文本格式化标签&#xff08;四&#xff09; 一、超链接 HTML使用标签 <a>来设置超文本链接。超链接可以是一个字&#xff0c;一个词&#xff0c;或者一组词&#xff0c;也可以是一幅图像&#xff0c;您可以点击这些内容来跳转到新的文…

别再问我供应商质量工程师(SQE)是干什么的了,这是最好的解释。

供应商质量工程师&#xff08;SQE&#xff09;是指一种负责监督供应商质量的职业。SQE的工作主要包括以下几项内容&#xff1a; 核查供应商质量&#xff1a;通过对供应商的产品、服务和生产流程的评估&#xff0c;来确保供应商的质量符合公司的标准和要求。开展质量审核&#…

【STM32笔记】HAL库低功耗STOP停止模式的串口唤醒(解决串口唤醒和回调无法一起使用的问题)

【STM32笔记】HAL库低功耗停止模式的串口唤醒&#xff08;解决串口唤醒时钟问题&#xff09; 前文&#xff1a; blog.csdn.net/weixin_53403301/article/details/128216064 【STM32笔记】HAL库低功耗模式配置&#xff08;ADC唤醒无法使用、低功耗模式无法烧录解决方案&#xf…

家政服务小程序实战教程10-分类展示

小程序一般底部菜单栏会有一个分类的功能&#xff0c;点击分类&#xff0c;以侧边栏导航的形式列出所有类目&#xff0c;点击某个类目可以做数据筛选&#xff0c;我们本篇就实现一下该功能 01 优化数据源 在我们家政服务小程序里&#xff0c;我们已经建立了类型和服务的数据源…

企业财务管理升级,智慧税务和数据可视化打造新标准

一、引言在发展社会主义市场经济的过程中&#xff0c;税收承担着组织财政收入、调控经济、调节社会分配的职能。中国每年财政收入的90%以上来自税收&#xff0c;其地位和作用越来越重要&#xff0c;可称之为国家经济的“晴雨表”&#xff0c;有效进行税务管理、充分挖掘税务大数…

面试碰壁15次,作为一个已经28岁的测试工程师,路究竟该怎么走....

3年测试经验原来什么都不是&#xff0c;只是给你的简历上画了一笔&#xff0c;一直觉得经验多&#xff0c;无论在哪都能找到满意的工作&#xff0c;但是现实却是给我打了一个大巴掌&#xff01;事后也不会给糖的那种... 先说一下自己的个人情况&#xff0c;普通二本计算机专业…

深度学习知识补充

候选位置(proposal) RCNN 什么时ROI&#xff1f; 在图像处理领域&#xff0c;感兴趣区域(region of interest &#xff0c; ROI) 是从图像中选择的一个图像区域&#xff0c;这个区域是你的图像分析所关注的重点。圈定该区域以便进行进一步处理。使用ROI圈定你想读的目标&…

dfs(十)矩阵最长递增路径 (注意dfs前后状态的更新)

描述 给定一个 n 行 m 列矩阵 matrix &#xff0c;矩阵内所有数均为非负整数。 你需要在矩阵中找到一条最长路径&#xff0c;使这条路径上的元素是递增的。并输出这条最长路径的长度。 这个路径必须满足以下条件&#xff1a; 1. 对于每个单元格&#xff0c;你可以往上&#…

全解析 ESM 模块语法,出去还是进来都由你说了算

模块语法是ES6的一个重要特性&#xff0c;它的出现让JavaScript的模块化编程成为了可能。 在JavaScript中可以直接使用import和export关键字来导入和导出模块&#xff0c;但是这种语法并不是ES6的标准&#xff0c;而是ESM&#xff08;ECMAScript Module&#xff09;模块语法的…

【CICD】Jenkins 构建部署前端项目

出于对 CICD 的研究与学习&#xff0c;在初步学习了解并安装 jenkins 后&#xff0c;记录一下对于使用 jenkins 部署前端项目的过程。 1.目标 希望能够实现的是&#xff1a;在本地使用 git 工具将项目代码推送到远程仓库&#xff08;本篇使用 gitee 演示&#xff09;&#xf…

[C][KEIL5][IAR] 全局取消结构体对齐

文章目录一、 正常编译&#xff1a;二、 -fpack-struct 全局取消结构体对齐三、 结论&#xff1a;结构体字节不进行对齐的用途&#xff08;1&#xff09;减小内存占用的空间&#xff08;2&#xff09;直接将结构体作为通信协议&#xff08;在低带宽下通讯&#xff09;&#xff…

【Java】代码块的细节你搞懂了吗(基础知识七)

希望像唠嗑一样&#xff0c;one step one futher。 目录 &#xff08;1&#xff09;代码块的应用场景 &#xff08;2&#xff09;代码块的细节 1.static 代码块只加载一次 2.当调用类的静态成员时&#xff0c;类会加载 3. 使用类的静态成员时&#xff0c;static代码块会被执…

大数据第一轮复习笔记

linux: 添加用户 useradd 删除用户 userdel useradd -d指定组 添加组 groupadd 删除组 groupdel 创建目录 mkdir -p 删除目录 rm -rf 创建目录 touch cat -n 查看文件(显示行号)

Axure 9 收录不同效果的制作过程

效果类别 一、默认选中实现单选效果 1、默认选中 点击组件&#xff0c;右键选择selected字样&#xff1b; 2、实现单选效果 点击所有组件&#xff0c;右键选择selected group&#xff0c;填好命名&#xff0c;并设置选中时的组件样式&#xff1b;选择其中一个组件&#xf…

EMQX Cloud Serverless 正式上线:三秒部署、按量计费的 MQTT Serverless 云服务

近日&#xff0c;全球领先的开源物联网数据基础设施软件供应商 EMQ 正式发布了 MQTT Serverless 云服务 —— EMQX Cloud Serverless 的 Beta 版本&#xff0c;开创性地采用弹性多租户技术&#xff0c;用户无需关心服务器基础设施和服务规格伸缩所需资源&#xff0c;仅用三秒即…

十个程序员编程时的简单方法与技巧

你要记住&#xff0c;你写的代码是给人看的 作为一名程序员&#xff0c;希望在你某天离开公司后回想起的若干个开心时刻中&#xff0c;有一个会是因为你面对自己刚刚出炉了一份让自己心动的代码的那份感动&#xff0c;而不要成为上面提到的那个“离开后&#xff0c;公司才知道…