日常记录:《算法导论》学习笔记之四—快速排序
2016-11-23 13:08
246 查看
《算法导论》第7章讲到了快速排序(quick sort),快速排序通常是用于排序的最佳的实用选择,因为其平均性能比较好。与合并算法相同,快速排序也是基于分治模式的,笔者再次选择整理扑克牌的情形来解释这一排序过程。
合并排序中,是将杂乱的牌堆分为两堆,依次再堆子堆牌分解,而在快速排序中,分出子牌堆加了些条件,我们将牌堆底部的牌作为对照牌,将牌堆中大于或者小于这张对照牌的牌分成左右两堆,然后利用同一规则继续对子牌堆分,最后得到的就是整理好的牌。
我们将这个排序过程用个函数去表示,首先是快速排序的分治递归部分,其伪代码如下:
在《算法导论》的练习题中也有很多不一样的排序算法,或者是对原有算法进行改进优化得到的变体,当笔者再次翻过头来阅读这本经典书籍时会对这部分内容做详细总结。
合并排序中,是将杂乱的牌堆分为两堆,依次再堆子堆牌分解,而在快速排序中,分出子牌堆加了些条件,我们将牌堆底部的牌作为对照牌,将牌堆中大于或者小于这张对照牌的牌分成左右两堆,然后利用同一规则继续对子牌堆分,最后得到的就是整理好的牌。
我们将这个排序过程用个函数去表示,首先是快速排序的分治递归部分,其伪代码如下:
if l < r mid = PARTITION(A, l, r) QuickSort(A, l, mid -1) QuickSort(A, mid + 1, r)其中PARTITION是最重要的部分,这个函数实现了数组的就地排序,其伪代码如下:
key = A[r] i = l -1 for j : l to r - 1 if A[j] <= key i++ A[j] <-> A[i] i++ A[i] <-> A[r] return i给定一个实例,用C++实现快速排序的代码如下:
#include void QuickSort(int A[], int l, int r); int PARTITION(int A[], int l, int r); int main(void) { int A[12] = {13, 19, 9, 5, 12, 8, 7, 4, 11, 2, 6, 21}; QuickSort(A, 0, 11); for (int i = 0; i < 12; i++) std::cout << A[i] << " "; } void QuickSort(int A[], int l, int r) { if (l < r) { int mid = PARTITION(A, l, r); QuickSort(A, l, mid - 1); QuickSort(A, mid + 1, r); } } int PARTITION(int A[], int l, int r) { int key = A[r]; int i = l - 1; int temp = 0; for (int j = l; j < r; j++) { if (A[j] <= key) { i++; temp = A[j]; A[j] = A[i]; A[i] = temp; } } i++; A[r] = A[i]; A[i] = key; return i; }
在《算法导论》的练习题中也有很多不一样的排序算法,或者是对原有算法进行改进优化得到的变体,当笔者再次翻过头来阅读这本经典书籍时会对这部分内容做详细总结。
相关文章推荐
- 日常记录:《算法导论》学习笔记之三—堆排序
- 日常记录:《算法导论》学习笔记之一
- 日常记录:《算法导论》学习笔记之二
- [日常开发记录] pycurl python3 error(23, 'Failed writing body (0 != 456)') 解决
- DSP开发-日常记录
- 【java】 JAVA日常学习代码Demo快照记录1
- 同步复制日常记录收集
- 算法导论CLRS 7.3 随机版快速排序
- 日常记录
- 日常问题记录--访问JSP文件时The method getDispatcherType() is undefined for the type HttpServletRequest
- mysql日常问题记录
- 日常问题记录--JSP页面中通过<s:property value="#parameters.userName[0]>获取URL参数中文时为乱码的解决办法
- 算法导论之插入排序,选择排序,归并排序,冒泡排序,希尔排序,堆排序,快速排序的c语言实现
- 算法导论程序13-快速排序的描述(Python)
- 算法导论程序14-快速排序的随机化版本(Python)
- 算法导论7-2,针对相同元素的快速排序
- [原]让Markdown成为日常文本记录语言
- 日常记录-js篇
- LINQ日常使用记录
- 记录代码——快速排序