1. 相关概念
  2. 快速排序法 Quicksort 也是一个分治思想的算法.
  3. 对一个子数组 A[p: r] 进行快速排序的三步分治过程:
  4. 1, 分解. 将数组 A[p : r] 被划分为两个子数组(可能为空) A[p : q-1] A[q+1 : r] , 使得 A[p : q-1] 中的每一个元素都小于等于 A[q], 并且 A[q] 小于 A[q+1 : r] 中的每一个元素.
  5. 2, 解决. 通过递归调用快速排序, 对子数组 A[p : q-1] A[q+1 : r] 进行排序.
  6. 3, 合并. 快速排序算法是原址排序, 所以不需要合并操作.
  1. Python programming
  2. 1, 构建算法函数 quick_sort(A,p,r)
  3. def quick_sort(A, p, r):
  4. if p < r:
  5. q = partition(A, p, r) # 假定分解函数已经实现, 后续给出代码.
  6. quick_sort(A, p, q-1)
  7. quick_sort(A, q+1, r)
  8.  
  9. 2, 创建分解算法 partition(A,p,r)
  10. def partition(A, p, r):
  11. x = A[r]
  12. i = p - 1
  13. for j in range(p, r):
  14. print('Step', j+1)
  15. print(111, A)
  16. if A[j] <= x:
  17. i += 1
  18. print('Index', i,A[i],j,A[j])
  19. A[i], A[j] = A[j], A[i]
  20. print(222, A)
  21. print(333, i)
  22. print(444, A[i+1],A[r])
  23. A[i+1], A[r] = A[r], A[i+1]
  24. print(555, A,i+1)
  25. return i+1
  26.  
  27. 3, 程序运行
  28.  
  29. if __name__ == '__main__':
  30. A = [2,8,7,1,3,5,6,4]
  31. print('Before : ', A)
  32. quick_sort(A, 0, 7)
  33. print('After : ', A)
  34.  
  35. 结果打印:
  36. Before : [2, 8, 7, 1, 3, 5, 6, 4]
  37. Step 1
  38. 111 [2, 8, 7, 1, 3, 5, 6, 4]
  39. Index 0 2 0 2 # 将 A[0] 和 A[0] 交换
  40. 222 [2, 8, 7, 1, 3, 5, 6, 4] # 数组不变
  41. 333 0
  42. Step 2
  43. 111 [2, 8, 7, 1, 3, 5, 6, 4] # A[1] = 8 > x = 4, 不发生交换操作
  44. 333 0
  45. Step 3
  46. 111 [2, 8, 7, 1, 3, 5, 6, 4] # A[2] = 7 > x = 4, 不发生交换操作
  47. 333 0
  48. Step 4
  49. 111 [2, 8, 7, 1, 3, 5, 6, 4] # A[3] = 1 < x = 4, 发生交换操作
  50. Index 1 8 3 1 # A[1] 和 A[3] 交换
  51. 222 [2, 1, 7, 8, 3, 5, 6, 4] # 数组中的 8 和 1 发生交换
  52. 333 1
  53. Step 5
  54. 111 [2, 1, 7, 8, 3, 5, 6, 4] # A[4] = 3 < x = 4, 发生交换操作
  55. Index 2 7 4 3 # A[2] 和 A[4] 交换
  56. 222 [2, 1, 3, 8, 7, 5, 6, 4] # 数组中的 7 和 3 发生交换
  57. 333 2
  58. Step 6
  59. 111 [2, 1, 3, 8, 7, 5, 6, 4] # A[5] = 5 > x = 4, 不发生交换操作
  60. 333 2
  61. Step 7
  62. 111 [2, 1, 3, 8, 7, 5, 6, 4] # A[6] = 6 > x = 4, 不发生交换操作
  63. 333 2 # 最后 i = 2, 即 q 的值. 由于python 数组是 0 base 的, 为了递归调用的对齐, 返回 q = 2+1 = 3 (注: 对齐方法保持统一就可以)
  64. 444 8 4
  65. 555 [2, 1, 3, 4, 7, 5, 6, 8] 3 # 将 A[3 = 2+1 ] 和 x = A[7] 交换
  66.  
  67. # 得出 q 值后, 后续通过递归调用处理子数组 A[0, q-1] 和 A[q+1, 7]
  68. Step 1
  69. 111 [2, 1, 3, 4, 7, 5, 6, 8]
  70. Index 0 2 0 2
  71. 222 [2, 1, 3, 4, 7, 5, 6, 8]
  72. 333 0
  73. Step 2
  74. 111 [2, 1, 3, 4, 7, 5, 6, 8]
  75. Index 1 1 1 1
  76. 222 [2, 1, 3, 4, 7, 5, 6, 8]
  77. 333 1
  78. 444 3 3
  79. 555 [2, 1, 3, 4, 7, 5, 6, 8] 2
  80. Step 1
  81. 111 [2, 1, 3, 4, 7, 5, 6, 8]
  82. 333 -1
  83. 444 2 1
  84. 555 [1, 2, 3, 4, 7, 5, 6, 8] 0
  85. Step 5
  86. 111 [1, 2, 3, 4, 7, 5, 6, 8]
  87. Index 4 7 4 7
  88. 222 [1, 2, 3, 4, 7, 5, 6, 8]
  89. 333 4
  90. Step 6
  91. 111 [1, 2, 3, 4, 7, 5, 6, 8]
  92. Index 5 5 5 5
  93. 222 [1, 2, 3, 4, 7, 5, 6, 8]
  94. 333 5
  95. Step 7
  96. 111 [1, 2, 3, 4, 7, 5, 6, 8]
  97. Index 6 6 6 6
  98. 222 [1, 2, 3, 4, 7, 5, 6, 8]
  99. 333 6
  100. 444 8 8
  101. 555 [1, 2, 3, 4, 7, 5, 6, 8] 7
  102. Step 5
  103. 111 [1, 2, 3, 4, 7, 5, 6, 8]
  104. 333 3
  105. Step 6
  106. 111 [1, 2, 3, 4, 7, 5, 6, 8]
  107. Index 4 7 5 5
  108. 222 [1, 2, 3, 4, 5, 7, 6, 8]
  109. 333 4
  110. 444 7 6
  111. 555 [1, 2, 3, 4, 5, 6, 7, 8] 5
  112. After : [1, 2, 3, 4, 5, 6, 7, 8] # 完成快速排序. 快速排序算法是原址排序.
  113.  
  114.  

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. ORA-0245

    经常有客户报错ORA-0245 1.11.2 rac环境, rman存在snap控制文件路径,默认是文件系统[非共享,导致备份控制文件报错] 解决方法:将snap路径配置到ASM磁盘组共享路径[nfs ...

  2. notepad++批量每行加字符

    移动光标到头 选择正则 输入^ 下面输入需要加的文本. 点替换

  3. 性能测试-pidstat 问题定位分析

    pidstat 概述 pidstat是sysstat工具的一个命令,用于监控全部或指定进程的cpu.内存.线程.设备IO等系统资源的占用情况.pidstat首次运行时显示自系统启动开始的各项统计信息, ...

  4. 【错误】python百分号冲突not enough arguments for format string

    query = "SELECT * FROM devices WHERE devices.`id` LIKE '%{}%'".format("f2333") d ...

  5. Everything信息泄露

    Everything漏洞描述 [Everything]一款搜索文件非常快的工具,其速度之快令人震惊!它还有一个可以通过HTTP 或 FTP 分享搜索结果 的功能.它可以让用户在本地或局域网上的其他电脑 ...

  6. mongodb connection refused because too many open connections: 819

    Env Debian 9 # 使用通用二进制方式安装 # mongod --version db version v3.4.21-2.19 git version: 2e0631f5e0d868dd5 ...

  7. 8个超好用的Python内置函数,提升效率必备(小白必看)

    python中有许多内置函数,不像print那么广为人知,但它们却异常的强大,用好了可以大大提高代码效率. 这次来梳理下8个好用的python内置函数. 1.set() 当需要对一个列表进行去重操作的 ...

  8. php中垃圾回收机制

    php中垃圾回收机制 我们可能在开发中经常会听到gc,是的gc就是垃圾回收容器,全称Garbage Collection. 此篇文章中“垃圾”的概念:如果一个变量容器能被减少到0,说明他就已经没有被引 ...

  9. sqlilabs less18-22 HTTP头的注入

    less18 user-agent的注入 源码分析: check_input对name,password进行了过滤 function check_input($value) { if(!empty($ ...

  10. D3.js 力导向图的显示优化

    D3.js 作为一个前端,说到可视化除了听过 D3.js 的大名,常见的可视化库还有 ECharts.Chart.js,这两个库功能也很强大,但是有一个共同特点是封装层次高,留给开发者可设计和控制的部 ...