首页 > 编程语言 >快速排序算法原理与python实现

快速排序算法原理与python实现

时间:2023-11-04 14:01:13浏览次数:40  
标签:Arr right python QS 指针 算法 pivot 排序 left

快速排序是一种不稳定的排序算法,时间复杂度O(nlogn),最差情况下时间复杂度为O(n^2)
原理是:

  • 选定待排序数组的任意元素为基准轴:pivot,通常选择数组第一个元素,保存下pivot数值。
  • 遍历数组中的其他元素,通过交换元素位置,数组被划分为两个子序列:左子序列元素值全小于等于pivot,右子序列元素值大于等于pivot,而2个子序列中间位置值设为pivot。
  • 目前数组宏观上有序(左子序列 <= pivot <= 右子序列),微观上的左子序列、右子序列内部并不一定是有序的,递归地分别进行快速排序。

其中,算法递归结束条件是输入序列的长度为0或者是1,则算法返回。本文给出基于python3的两种实现方法,两者都需要动态地维护左指针、右指针。

QuickSort函数伪代码

    输入:  待排序的数值数组Arr、左指针left、 右指针right
    目标:  希望对数组的 [left,right] 区间内元素进行升序排序 

    1. pivot = left,  value = Arr[pivot],i = left, j = right
    2. 判断是否Arr[j]小于value
        2.1 若是,则 Arr[i] = Arr[j],左指针i+=1(判断i == j ? 若是则进入第4步骤),右指针位置不变,进入第3步骤
        2.2 若否,则右指针持续递减直到符合(2.1)条件

    3. 判断是否Arr[l]大于value
        3.1 若是,则 Arr[r] = Arr[l],右指针r-=1(判断i == j ? 若是则进入第4步骤),左指针位置不变,进入第2步骤
        3.2 若否,则左指针持续递增直到符合(3.1)条件

    4. Arr[i] = value 或 Arr[j] = value
    5. 递归:
        if (i - 1) - left > 1:
            QS(Arr, left,i-1)
        if right - (i + 1) > 1:
            QS(Arr, i+1, right)

    6. 返回Arr

实现1

def QS(Arr, left, right):
    pivot = left
    val = Arr[pivot]
    i, j = left, right
    
    while True:
        while Arr[j] >= val and i < j:    # 默认情况,不需要排序
            j -= 1
        else:
            if i == j:
                break
            Arr[i] = Arr[j]
            i += 1

        while Arr[i] <= val and i < j:     # 默认情况,不需要排序
            i += 1
        else:
            if i == j:
                break
            Arr[j] = Arr[i]
            j -= 1

    Arr[i] = val
    if i - left > 2 :
        QS(Arr, left, i - 1)
    if right - i > 2 :
        QS(Arr, i + 1, right)

if __name__ == '__main__':
    NumArr = [5, 12, 1, 10, 9, 6, 2, 3]
    QS(NumArr, 0, len(NumArr) - 1)
    print(NumArr)

实现2

def QS(Arr, left, right):
    if left >= right:
        return    
    i,j = left,right
    pivot = Arr[left]

    while True:
        while Arr[i] <= pivot:
            i += 1
            if i == right:
                break
        
        while Arr[j] >= pivot:
            j -= 1
            if j == left:
                break
        
        if i >= j:
            break

        Arr[i], Arr[j] = Arr[j], Arr[i]
    
    Arr[left] = Arr[j]  # 不能是 i ,必须是 j
    Arr[j] = pivot      # 不能是 i ,必须是 j

    QS(Arr, left, j-1)
    QS(Arr, j+1, right)



if __name__ == '__main__':
    NumArr = [5, 12, 1, 10, 9, 6, 2, 3]
    QS(NumArr, 0, len(NumArr) - 1)
    print(NumArr)

实现代码2的原理示意图

上述两种实现途径的核心原理一致,然而具体的细节略有区别:

  • 代码1中,每一次移动一个指针(如i)到达临界位置,立即进行元素值交换(Arr[j] = Arr[i]),再移动另一个指针(j)到达临界位置,立即进行元素值交换(Arr[i] = Arr[j]);而代码2中,先分别找到左右指针i、j的临界位置,直接进行一次位置交换(Arr[i], Arr[j] = Arr[j], Arr[i])。
  • 代码1中,while循环的判定条件必须是i指针与j指针重合,重合位置被赋予已经保存的pivot值;而代码2中,while循环结束后一定是Arr[i] > pivotArr[j] < pivot,则i=j+1(此时左指针在右指针右侧),此时然后将Arr[j]Arr[0]值互相交换;因为:Arr[j] < pivot = Arr[0],交换后Arr[j] = pivot仍满足j指针左侧子序列元素值都小于pivot。
  • 代码1中,进入while循环时,必须先递减右指针j寻找临界条件,保证Arr[0]即pivot的位置先被覆盖掉,再递增左指针i;而代码2中,Arr[0]即pivot元素的位置在while循环结束后才被Arr[j]修改。

原理参考

代码1原理: https://www.bilibili.com/video/BV1j841197rQ/?spm_id_from=333.337.search-card.all.click&vd_source=b7b6e787539db9495683021cda9715f5

代码2原理: https://blog.csdn.net/qq_53414724/article/details/125016223

标签:Arr,right,python,QS,指针,算法,pivot,排序,left
From: https://www.cnblogs.com/Higgerw/p/17809255.html

相关文章

  • 音乐推荐与管理系统Python+Django网页界面+协同过滤推荐算法
    一、介绍音乐推荐与管理系统。本系统采用Python作为主要开发语言,前端使用HTML、CSS、BootStrap等技术搭建界面平台,后端使用Django框架处理请求,并基于Ajax等技术实现前端与后端的数据通信。在音乐个性推荐功能模块中采用通过Python编写协同过滤推荐算法模块,实现对当前登录用户的个......
  • 字符串匹配算法:KMP
    Knuth–Morris–Pratt(KMP)是由三位数学家克努斯、莫里斯、普拉特同时发现,所有人们用三个人的名字来称呼这种算法,KMP是一种改进的字符串匹配算法,它的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。它的时间复杂度是O(m+n)字符匹配:给你两个字符......
  • 在CentOS容器中安装Python 3.8
     进入已下载的CentOS容器终端:dockerrun-itcentos:7.9.2009/bin/bash在容器终端中,首先更新系统软件包列表:yumupdate安装相关依赖包以支持Python编译和构建过程:yuminstallgccopenssl-develbzip2-devellibffi-devel-y下载Python3.8的源代码包(源码包可......
  • 第一个python程序
    目标第一个HelloPython程序Python2.x与3.x版本简介执行Python程序的三种方式解释器——python/python3交互式——ipython集成开发环境——PyCharm01.第一个HelloPython程序1.1Python源程序的基本概念Python源程序就是一个特殊格式的文本文件,可以使用任意文......
  • 【小沐学Python】Python实现Web图表功能(Dash之基本功能)
    1、简介Dash是下载量最大,最值得信赖的Python框架,用于构建ML和数据科学Web应用程序。Dash是一个用来创建web应用的python库,它建立在Plotly.js(同一个团队开发)、React和Flask之上,主要的用户群体是数据分析者、AI从业者,可以帮助他们快速搭建非常美观的网页应用,而且不需要......
  • 在Anaconda中安装Python的seaborn库
      本文介绍在Anaconda的环境中,安装Python语言中,常用的一个绘图库seaborn模块的方法。  seaborn模块是基于Matplotlib的数据可视化库,它提供了一种更简单、更漂亮的界面来创建各种统计图形。seaborn模块主要用于数据探索、数据分析和数据可视化,使得我们在Python中创建各种统计图......
  • 基于Python+Pygame实现一个滑雪小游戏
    目录项目介绍Pygame介绍项目文件夹介绍演示视频代码免费领取一、项目介绍使用介绍:运行main.py文件后,通过左右按键可以控制小人的移动,如果经过旗杆那么+10分,如果碰到树木那么减50分。二、Pygame介绍Pygame是一个用于游戏开发和多媒体应用的Python库。它是基于SDL(Simple......
  • 【教3妹学编程-算法题】117. 填充每个节点的下一个右侧节点指针 II
    2哥 :3妹,听说你昨天去面试了,怎么样啊?3妹:嗨,别提了,让我回去等通知,估计是没有通知了,还浪费我请了一天假。2哥 :你又请假了啊,你是怎么跟你那个严厉的老板请假的。3妹:我说我2哥生病了,嘿嘿~2哥:一猜就是说我生病了,自从你找工作,我这一年都病了十几回了……3妹:没办法,假不好请嘛,我尽快......
  • 教3妹学编程-算法题】2914. 使二进制字符串变美丽的最少修改次数
    3妹:呜呜,烦死了,脸上长了一个痘2哥 :不要在意这些细节嘛,不用管它,过两天自然不就好了。3妹:切,你不懂,影响这两天的心情哇。2哥 :我看你是不急着找工作了啊,工作那么辛苦,哪还有时间想这些啊。3妹:说到找工作,我又要去刷题了。2哥:我给你出一道关于美丽的题吧,让你的心情美丽美丽~ 1题目......
  • 【教3妹学编程-算法题】数组中两个数的最大异或值
    3妹:“太阳当空照,花儿对我笑,小鸟说早早早,你为什么背上炸药包”2哥 :3妹,什么事呀这么开心呀。3妹:2哥你看今天的天气多好啊,阳光明媚、万里无云、秋高气爽,适合秋游。2哥:是啊,都快立冬了,天气还是这么热。今年的冬天比以往来的要晚一些。3妹:晚来也是要来的,看天气预报下周要降温,估计没几......