算法导论:快速排序及其随机化版本
来源:互联网 发布:天猫美工职责 编辑:程序博客网 时间:2024/05/23 18:26
快速排序的描述
快速排序使用了分治思想,分为三个步奏完成
- 分解:数组array[p, r]分解为两个子数组array[p, q-1]和array[q+1, r],使得array[q]分别大于等于和小于等于两个数组里面的值。
- 解决:调用快速排序,对上面的两个子数组进行排序
- 合并:因为子数组都是原址排序,所以不需要合并操作。
下面的程序实现快速排序(python 2.x):
def quick_sort(array, p, r): if p < r: q = partition(array, p, r) quick_sort(array, p, q-1) quick_sort(array, q+1, r)
为了排序数组的全部元素,初始调用quick_sort(array, 0, len(array)-1).
数组的划分
算法的关键部分:partition()过程,实现对数组的原址排序。
def partition(array, p, r): x = array[r] i = p-1 for j in range(p, r): if array[j] <= x: i += 1 temp = array[i] array[i] = array[j] array[j] = temp temp = array[i+1] array[i+1] = array[r] array[r] = temp return i + 1
实验部分:
实验代码:
arr = [12, 8, 7, 1, 3, 5, 6, 4]print 'Before quick_sort:', arrquick_sort(arr, 0, len(arr)-1)print 'After quick_sort:', arr
实验结果:
Before quick_sort: [12, 8, 7, 1, 3, 5, 6, 4]
After quick_sort: [1, 3, 4, 5, 6, 7, 8, 12]
快速排序的随机化版本
与始终采用array[r]作为主元的方法不同,随机抽样是从array[p..r]中随机选择一个元素作为主元。为达到这一目的,首先将array[r]与从array[p..r]中随机选取的一个元素交换。对上面的代码改动非常的小,只是添加了几行代码。上面的partition()函数还是会被继续使用。
def randomized_partition(array, p, r): i = random.randint(p, r) temp = array[i] array[i] = array[r] array[r] = temp return partition(array, p, r)def randomized_quick_sort(array, p, r): if p < r: q = randomized_partition(array, p, r) randomized_quick_sort(array, p, q-1) randomized_quick_sort(array, q+1, r)
实验如下:
#codearr = [12, 8, 7, 1, 3, 5, 6, 4]print 'Before quick_sort:', arrrandomized_quick_sort(arr, 0, len(arr)-1)print 'After quick_sort:', arr#resultD:\ProgramData\Anaconda2\python.exe G:/GUI/QuickSort.pyBefore quick_sort: [12, 8, 7, 1, 3, 5, 6, 4]After quick_sort: [1, 3, 4, 5, 6, 7, 8, 12]
阅读全文
1 0
- 算法导论:快速排序及其随机化版本
- 算法导论之随机化快速排序实现
- 《算法导论》笔记 第7章 7.3快速排序的随机化版本
- 算法导论上的quicksort实现 快速排序的随机化版本
- 算法导论程序14-快速排序的随机化版本(Python)
- 算法导论第三版第七章快速排序(一般和随机化版本)
- 算法实践篇-快速排序-随机化版本
- 经典算法--快速排序的随机化版本
- 算法基础4:快速排序(随机化版本)
- 快速排序(随机化版本)
- 快速排序随机化版本
- 快速排序随机化版本
- 快速排序 随机化版本
- 【算法导论】c++实现的随机化的快速排序
- 算法导论(一):快速排序与随机化快排
- 随机化快速排序算法
- 随机化快速排序算法
- 排序算法之快速排序的随机化版本
- CentOS 安装 opencv, 解决 Python cv2 module 问题
- 泛型固定下边界 ? super E *泛型固定上边界 ? extends E
- 卷积神经网络
- Servlet接口
- 拷贝、赋值和销毁
- 算法导论:快速排序及其随机化版本
- Ubuntu中使用Composer Install/Update常见报错解决办法
- React 入门实例教程
- 浏览器的跨域问题以及解决方案
- git常用命令一览
- Map集合
- axis2客户端调用免费的webservice服务的实例
- linux的top命令参数详解
- git向多个远程库提交代码