【连载】快速排序算法的普通版和简化版实现
来源:互联网 发布:单片机与上位机通信 编辑:程序博客网 时间:2024/06/11 20:42
快速排序算法
针对本算法仅提供核心部分代码。代码均是基于python。
1. 算法核心:
分治思想
步骤:
- 找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作, 使基准左边元素的值都不大于基准值, 基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。
- 递归快速排序,将其他n-1个元素也调整到排序后的正确位置。
- 最后每个元素都是在排序后的正确位置,排序完成。
2. 算法实现:
2.1 普通版
为方便使用,下面定义一个非递归的主函数,其中调用一个递归定义的函数(可以作为局部定义),给定划分范围初值:
def quick_sort(lst): qsort_rec(let, 0, len(lst) - 1)
- 递归过程的框架:
def qsort_rec(lst, l, r): if l >= r: return i = 1; j = r pivot = lst[i] while i < j: ... ... ... ... lst[i] = pivot qsort_rec(lst, l, i - 1) qsort_rec(lst, i + 1, r)
- 递归的快速排序函数:
def qsort_rec(lst, l, r): if l >= r: return i = 1; j = r pivot = lst[i] while i < j: while i < j and lst[j].key >= pivot.key j -= 1 if i < j: lst[i] = lst[j] i += 1 while i < j and lst[i].key <= pivot.key i += 1 if i < j: lst[j] = lst[i] j -= 1 lst[i] = pivot qsort_rec(lst, l, i - 1) qsort_rec(let, i + 1, r)
上述代码过程完全遵循上面的框架,只是填入了划分过程的细节,包括各种比较条件、变量 i 和 j 的修改操作、元素移动操作等。
2.2 简化版
思想:R作为划分标准的记录,以其关键码K作为分界线,将表中记录(一般而言,是表中一个分段中的记录)划分为两组。工作过程中本分段的记录(除R外)顺序分为三组:小记录,大记录,未检查记录。
这里用两个下表变量,i 的值总是最后一个小记录的下标,而 j 的值是第一个未处理记录的下标。每次迭代比较K与记录 j 的关键码,有两种情况:
- 记录 j 较大:这时简单地将 j 加一,又恢复到原图类似状态。
记录 j 较小:这时需要把这个记录调到左边,做法是将 i 加一,而后交换 i 和 j 位置的记录,并将 j 值加一,又恢复到原图类似状态。
代码实现:
def quick_sort(lst): def qsort(lst, begin, end): if begin >= end: return pivot = lst[begin].key i = begin for j in range(begin + 1, end + 1): if lst[i].key < pivot: i += 1 lst[i], lst[j] = lst[j], lst[i] lst[begin], lst[i] = lst[i], lst[begin] qsort(lst, begin, i - 1) qsort(lst, i + 1, end) qsort(lst, 0, len(lst) - 1)
如果需要完整代码实现的话,可以到我的Github仓库下载,不过,只提供Java版代码实现。
阅读全文
0 0
- 【连载】快速排序算法的普通版和简化版实现
- 素数的算法 普通算法 函数实现 和 快速算法
- 快速排序算法和冒泡排序算法的java实现
- 插入排序、选择排序和快速排序的算法实现
- 普通的快速排序
- 普通排序算法的C++实现
- 快速排序算法和实现
- 快速排序算法 和 实现
- 归并排序和快速排序的算法实现
- 归并排序和快速排序算法实现
- 快速排序算法的实现
- 快速排序算法的实现
- 快速排序的算法实现
- 快速排序算法的实现
- 快速排序算法的实现
- 快速排序算法的实现
- 快速排序算法实现(C版)
- 快速排序算法C++实现[评注版]
- 1063. 计算谱半径(20)
- 【Scikit-Learn 中文文档】特征选择
- dftfilt函数
- Struts2标签库整理
- Hadoop的RPC实现
- 【连载】快速排序算法的普通版和简化版实现
- Linux系统 服务器环境搭建jdk+mysql+tomcat
- java基础-找出两个字符串相同的最大子串
- cbrt
- map的三种遍历方式
- input checkbox勾选怎么点击去掉勾
- 2017.11.23
- ACM-11月23日周四周中训练心得
- python之join和split