算法导论:快速排序及其随机化版本
2017-06-21 11:09
274 查看
快速排序的描述
快速排序使用了分治思想,分为三个步奏完成分解:数组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:', arr quick_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)
实验如下:
#code arr = [12, 8, 7, 1, 3, 5, 6, 4] print 'Before quick_sort:', arr randomized_quick_sort(arr, 0, len(arr)-1) print 'After quick_sort:', arr #result D:\ProgramData\Anaconda2\python.exe G:/GUI/QuickSort.py Before quick_sort: [12, 8, 7, 1, 3, 5, 6, 4] After quick_sort: [1, 3, 4, 5, 6, 7, 8, 12]
相关文章推荐
- 快速排序及其随机化(算法导论)
- 快速排序(算法导论中的版本)
- 算法导论7.3快速排序的随机化版本
- 【算法导论】c++实现的随机化的快速排序
- 快速排序和随机化快速排序(算法导论第七章)
- 算法基础4:快速排序(随机化版本)
- 算法设计之快速排序的随机化版本 (C++实现)
- C++快速排序实现(quicksort) (算法导论)
- 经典算法--快速排序的随机化版本
- 快速排序(随机化版本)
- 【算法导论】C++源码之快速排序
- [算法导论]快速排序
- 算法导论7.1-4习题解答(快速排序)
- 【算法导论】快速排序实现
- 【算法导论】用C++实现快速排序
- [算法导论]第七章《快速排序》
- [算法导论][排序算法]快速排序(quick sort)
- 算法导论 第七章快速排序与随机快速排序
- C++ 快速排序实现(算法导论)
- [算法导论] 快速排序以及最大堆的C++实现