IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 快速排序算法_疑点和思路 -> 正文阅读

[数据结构与算法]快速排序算法_疑点和思路

前言

主要三部分:
思路
难点
具体代码(含有关键部分的注释)

一、快速排序的思路

  1. 将传入的alist 中的第一个数据作为首先排序的数据(mid_value)
  2. 建立两个游标(low and high),右游标左移开始,之后交换数据,左游标右移,直到两个游标相遇,结束循环,找到 mid_value的位置,此时alist 可以分为两部分,左边部分的元素值<mid_value; 右边部分的元素值>mid_value
  3. 新产生的两部分会重新利用快速排序算法进行排序(即利用递归的思想)

二、快速排序的难点

1. low游标和high 游标位置重合时候,停止循环,找打了mid_value的位置

  1. low 遍历 和high 遍历需要放在循环条件内部(#2 ; #1),不能放在外部,否则,二者会发生重合后错过
  2. 一旦两个重合,跳出#3的循环,则alist[low] or alist[high]=mid_value

2.遍历对象还是原来的alist,不能是新的对象

  1. 通过第一个值,可以将alist分为两部分,每部分需要再次排序算法进行新的排序,即可以利用递归思想
  2. 但是如果利用切片传入对象,则排序会产生新的对象,而不是在原来的alist上进行排序
    例如:#5 和#6
    Quick_sort(alist[0,low-1]),因为该切片产生的是一个新的迭代对象,不是在同一个列表上进行操作
    3.传入还是整个列表alist,但是指定操作位置(first,last) #5,#6, 该数值主要取决于实例化对象后传入的数据

三、快速排序的代码展示

def Quick_sort(alist,first,last):
    mid_value=alist[first]
    """产生low游标"""
    low=first
    """产生high游标"""
    high=last
    """找到mid_value的值的条件是low==high,否则high继续左移,low继续右移"""
    """一旦low==high,这个时候high or low 的位置是mid_value 的位置"""
    if first>=last:
        return
    else:
        while low <high:#3
            """右游标开始进行比较"""
            while low <high and alist[high]>=mid_value:#1
                high-=1 # 只有右边的数据>= mid_value时,才会进行游标移动(包含等于,因为可以将=mid_value的数值同一放在一边)
                """一旦high所指的元素小于mid_value时,就会退出#1的循环"""
            alist[low]=alist[high]
            while low<high and alist[low]<mid_value:#2
                low+=1# 只有左边的数据>mid_value时候,low游标才会进行移动。
                """此时即使上一个循环#1已经将high游标所指的值进行交换,但是实际上,也满足该条件,以为交换就是交换的值<mid_value"""
            alist[high]=alist[low]
        """#1和#2循环进行交替遍历,只有当low=high时候才会停止#1和#2的循环,即跳出#3的循环"""
        alist[low]=mid_value #4

        """由mid_value产生的两部分需要进一步进行快速排序"""
        """first:指定low的起始位置"""
        """last:指定high 的起始位置"""
        Quick_sort(alist,first,low-1)#5 :前面一部分,不能写成Quick_sort(alist[0,low-1]),因为该切片产生的是一个新的迭代对象,不是在同一个列表上进行操作
        Quick_sort(alist, low+1, last)#6 :后面一部分,不能写成Quick_sort(alist[low+1,len(alist)-1]),因为该切片产生的是一个新的迭代对象,不是在同一个列表上进行操作
if __name__=="__main__":
    li = [54,26,93,17,77,31,44,55,20]
    print(li)
    Quick_sort(li,0,len(li)-1)
    print(li)
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-26 12:18:24  更:2021-07-26 12:19:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/26 23:27:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码