相关概念
快速排序法 Quicksort 也是一个分治思想的算法.
对一个子数组 A[p: r] 进行快速排序的三步分治过程:
1, 分解. 将数组 A[p : r] 被划分为两个子数组(可能为空) A[p : q-1] 和 A[q+1 : r] , 使得 A[p : q-1] 中的每一个元素都小于等于 A[q], 并且 A[q] 小于 A[q+1 : r] 中的每一个元素.
2, 解决. 通过递归调用快速排序, 对子数组 A[p : q-1] 和 A[q+1 : r] 进行排序.
3, 合并. 快速排序算法是原址排序, 所以不需要合并操作.
Python programming

    1, 构建算法函数 quick_sort(A,p,r)

        def quick_sort(A, p, r):
if p < r:
q = partition(A, p, r) # 假定分解函数已经实现, 后续给出代码.
quick_sort(A, p, q-1)
quick_sort(A, q+1, r) 2, 创建分解算法 partition(A,p,r) def partition(A, p, r):
x = A[r]
i = p - 1
for j in range(p, r):
print('Step', j+1)
print(111, A)
if A[j] <= x:
i += 1
print('Index', i,A[i],j,A[j])
A[i], A[j] = A[j], A[i]
print(222, A)
print(333, i)
print(444, A[i+1],A[r])
A[i+1], A[r] = A[r], A[i+1]
print(555, A,i+1)
return i+1 3, 程序运行 if __name__ == '__main__':
A = [2,8,7,1,3,5,6,4]
print('Before : ', A)
quick_sort(A, 0, 7)
print('After : ', A) 结果打印:
Before : [2, 8, 7, 1, 3, 5, 6, 4]
Step 1
111 [2, 8, 7, 1, 3, 5, 6, 4]
Index 0 2 0 2 # 将 A[0] 和 A[0] 交换
222 [2, 8, 7, 1, 3, 5, 6, 4] # 数组不变
333 0
Step 2
111 [2, 8, 7, 1, 3, 5, 6, 4] # A[1] = 8 > x = 4, 不发生交换操作
333 0
Step 3
111 [2, 8, 7, 1, 3, 5, 6, 4] # A[2] = 7 > x = 4, 不发生交换操作
333 0
Step 4
111 [2, 8, 7, 1, 3, 5, 6, 4] # A[3] = 1 < x = 4, 发生交换操作
Index 1 8 3 1 # A[1] 和 A[3] 交换
222 [2, 1, 7, 8, 3, 5, 6, 4] # 数组中的 8 和 1 发生交换
333 1
Step 5
111 [2, 1, 7, 8, 3, 5, 6, 4] # A[4] = 3 < x = 4, 发生交换操作
Index 2 7 4 3 # A[2] 和 A[4] 交换
222 [2, 1, 3, 8, 7, 5, 6, 4] # 数组中的 7 和 3 发生交换
333 2
Step 6
111 [2, 1, 3, 8, 7, 5, 6, 4] # A[5] = 5 > x = 4, 不发生交换操作
333 2
Step 7
111 [2, 1, 3, 8, 7, 5, 6, 4] # A[6] = 6 > x = 4, 不发生交换操作
333 2 # 最后 i = 2, 即 q 的值. 由于python 数组是 0 base 的, 为了递归调用的对齐, 返回 q = 2+1 = 3 (注: 对齐方法保持统一就可以)
444 8 4
555 [2, 1, 3, 4, 7, 5, 6, 8] 3 # 将 A[3 = 2+1 ] 和 x = A[7] 交换 # 得出 q 值后, 后续通过递归调用处理子数组 A[0, q-1] 和 A[q+1, 7]
Step 1
111 [2, 1, 3, 4, 7, 5, 6, 8]
Index 0 2 0 2
222 [2, 1, 3, 4, 7, 5, 6, 8]
333 0
Step 2
111 [2, 1, 3, 4, 7, 5, 6, 8]
Index 1 1 1 1
222 [2, 1, 3, 4, 7, 5, 6, 8]
333 1
444 3 3
555 [2, 1, 3, 4, 7, 5, 6, 8] 2
Step 1
111 [2, 1, 3, 4, 7, 5, 6, 8]
333 -1
444 2 1
555 [1, 2, 3, 4, 7, 5, 6, 8] 0
Step 5
111 [1, 2, 3, 4, 7, 5, 6, 8]
Index 4 7 4 7
222 [1, 2, 3, 4, 7, 5, 6, 8]
333 4
Step 6
111 [1, 2, 3, 4, 7, 5, 6, 8]
Index 5 5 5 5
222 [1, 2, 3, 4, 7, 5, 6, 8]
333 5
Step 7
111 [1, 2, 3, 4, 7, 5, 6, 8]
Index 6 6 6 6
222 [1, 2, 3, 4, 7, 5, 6, 8]
333 6
444 8 8
555 [1, 2, 3, 4, 7, 5, 6, 8] 7
Step 5
111 [1, 2, 3, 4, 7, 5, 6, 8]
333 3
Step 6
111 [1, 2, 3, 4, 7, 5, 6, 8]
Index 4 7 5 5
222 [1, 2, 3, 4, 5, 7, 6, 8]
333 4
444 7 6
555 [1, 2, 3, 4, 5, 6, 7, 8] 5
After : [1, 2, 3, 4, 5, 6, 7, 8] # 完成快速排序. 快速排序算法是原址排序.  

Reference,

  1, Introduction to algorithms

Algorithms - Quicksort - 快速排序算法的更多相关文章

  1. 快速排序算法(Quicksort)

    快速排序算法是对集合中元素进行排序最通用的算法,俗称快排,其算法的时间复杂度为O(nlgn),空间复杂度为O(1). 我们举例来对其算法思路进行理解,譬如数组 A = { 4, 8, 1, 2, 9, ...

  2. 现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法

    欢迎大家加入我的社区:http://t.csdn.cn/Q52km 社区中不定时发红包 文章目录 1.UML类图 2.源码: 3.优缺点分析 1.UML类图 2.源码: package com.bac ...

  3. 快速排序算法 java 实现

    快速排序算法 java 实现 快速排序算法Java实现 白话经典算法系列之六 快速排序 快速搞定 各种排序算法的分析及java实现 算法概念 快速排序是C.R.A.Hoare于1962年提出的一种划分 ...

  4. C# 集合扩展快速排序算法

    /// <summary> /// 对集合进行排序,如 /// List<Person> users=new List<Person>(){.......} /// ...

  5. 快速排序算法-C语言实现

    注:本篇内容为翻译,之所以选择这篇进行翻译原因是该文章含有动画,能够更加直观地展示快速排序.同时,可以仔细看一下代码,代码中把结构化的思想给予了更加充分地表现.按照功能进行模块划分的思想得到了彻底地贯 ...

  6. C#快速排序算法基础入门篇

    相信算法对于许多开发人员来说都是一大难点,之所以难,就像设计模式一样,许多人在阅读之后,没有很好地理解,也不愿意动手上机操作,只停留在理论的学习上面,随着时间推移就慢慢淡忘. 有些东西,你可以发明创造 ...

  7. PHP实现快速排序算法

    快速排序(Quick Sort)是对冒泡排序的一种改进,属不稳定排序算法,由东尼·霍尔在1962年提出.快速排序基本步骤:从数列中挑出一个元素(一般称为称为“基准”),通过一趟排序将要排序的数据分割成 ...

  8. Java快速排序算法

    快速排序算法思想: 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一 ...

  9. 排序系列 之 快速排序算法 —— Java实现

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

随机推荐

  1. Pet BFS

    一天早上小明醒来时发现他的宠物仓鼠不见了. 他在房间寻找但是没找到仓鼠. 他想用奶酪诱饵去找回仓鼠. 他把奶酪诱饵放在房间并且等待了好几天. 但是可怜的小明除了老鼠和蟑螂没见到任何东西. 他找到学校的 ...

  2. Problem L. World Cup

    题目大意:有A,B,C,D四个队伍,两两之间有一个比赛,假如A和B比赛,如果平局,各加一分,如果说A胜,给A加3分,不给B加分,B胜同理 给出A,B,C,D,的得分,判断形成这种局面有多少种方式. 思 ...

  3. Python - 翻译Talk Python To Me (和我聊Python) 播客

    “和我聊Python”是一个美国的聊天播客,英文名Talk Python To Me,类似于喜马拉雅的音频课程节目,只不过这个主题是编程语言Python.该节目从2015年的节目到现在,已经超过256 ...

  4. GraphicsLab Project 之 Curl Noise

    作者:i_dovelemon 日期:2020-04-25 主题:Perlin Noise, Curl Noise, Finite Difference Method 引言 最近在研究流体效果相关的模拟 ...

  5. react引入图片不显示问题

    在react 中引入图片的方式和正常不同,,很容易引入不显示 引入本地图片 1.(采用组件式引入方法) import Logo from "图片路径" <img src={L ...

  6. thinkphp--create()的使用方法(个人感悟)

    M方法和D方法的区别 ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类. 使用M方法 如果是如下情况,请考虑使用 ...

  7. PHP中静态(static)调用非静态方法详解--调用!!!

    来源:https://www.cnblogs.com/yolo-bean/p/7739265.html 这里分析了php面向对象中static静态属性和静态方法的调用.关于它们的调用(能不能调用,怎么 ...

  8. 解决laravel5.4视图不生效的坑

    遇到这种坑,主要是路由的问题 1.看看是不是单词拼错了 Route::get('/posts/{post}','\App\Http\Controllers\PostController@show'); ...

  9. php下载各种编辑器输出的内容到word中展示

    <?php/** * Created by PhpStorm. * User: 工作 * Date: 2018/1/11 * Time: 12:02 */ //连接数据库$dsn = " ...

  10. weblogic补丁升级详细步骤,18.7.17补丁更新

    weblogic打补丁 到weblogic官网下载补丁包 对应的补丁包  如: p22248372_1036012_Generic.zip 一  安装补丁步骤 1.登录linux的weblogic用户 ...