算法导论-------------快排的研究
2014-11-16 17:00
225 查看
本章介绍了快速排序及其算法分析,快速排序采用的是分治算法思想,对包含n个数的输入数组,最坏情况下运行时间为θ(n^2),但是平均性能相当好,期望的运行时间为θ(nlgn)。另外快速排序能够就地排序(我理解是不需要引入额外的辅助空间,每次划分能确定一个元素的具体位置),在虚拟环境中能很好的工作。
1、快速排序的描述
快速排序算法采用的分治算法,因此对一个子数组A[p…r]进行快速排序的三个步骤为:
(1)分解:数组A[p...r]被划分为两个(可能为空)子数组A[p...q-1]和A[q+1...r],给定一个枢轴,使得A[p...q-1]中的每个元素小于等于A[q],A[q+1...r]中的每个元素大于等于A[q],q下标是在划分过程中计算得出的。
(2)解决:通过递归调用快速排序,对子数组A[p...q-1]和A[q+1...r]进行排序。
(3)合并:因为两个子数组是就地排序,不需要合并操作,整个数组A[p…r]排序完成。
快速排序关键过程是对数组进行划分,划分过程需要选择一个主元素(pivot element)作为参照,围绕着这个主元素进划分子数组。举个列说明如何划分数组,现有子数组A={24,15,27,5,43,87,34},以最后一个元素为主元素进行划分,划分过程如图所示:
根据划分过程的为代码,书中又给出了快速排序的为代码:
好了 理解了就可以根据伪代码来写测试:
1、快速排序的描述
快速排序算法采用的分治算法,因此对一个子数组A[p…r]进行快速排序的三个步骤为:
(1)分解:数组A[p...r]被划分为两个(可能为空)子数组A[p...q-1]和A[q+1...r],给定一个枢轴,使得A[p...q-1]中的每个元素小于等于A[q],A[q+1...r]中的每个元素大于等于A[q],q下标是在划分过程中计算得出的。
(2)解决:通过递归调用快速排序,对子数组A[p...q-1]和A[q+1...r]进行排序。
(3)合并:因为两个子数组是就地排序,不需要合并操作,整个数组A[p…r]排序完成。
快速排序关键过程是对数组进行划分,划分过程需要选择一个主元素(pivot element)作为参照,围绕着这个主元素进划分子数组。举个列说明如何划分数组,现有子数组A={24,15,27,5,43,87,34},以最后一个元素为主元素进行划分,划分过程如图所示:
PARTITION(A,p,r) x = A[r] //将最后一个元素作为主元素 i = p-1 for j=p to r-1 //从第一个元素开始到倒数第二个元素结束,比较确定主元的位置 do if A[j] <= x i = i+1 exchange A[i] <-> A[j] exchange A[i+1]<->A[r] //最终确定主元的位置 return i+1 //返回主元的位置
根据划分过程的为代码,书中又给出了快速排序的为代码:
1 QUICKSORT(A,p,r) 2 if p<r 3 q = PARTITION(A,p,r) //确定划分位置 4 QUICKSORT(A,p,q-1) //子数组A[p...q-1] 5 QUICKSORT(Q,q+1,r) //子数组A[q+1...r]
好了 理解了就可以根据伪代码来写测试:
#include<iostream> using namespace std; void swap(int *x, int *y) { int tmp = *x; *x = *y; *y = tmp; } //划分数组 int partition(int a[], int begin, int last) { int x = a[last]; int i = begin - 1; for (int j = begin; j < last; j++) { if (x <= a[j]) { i=i+1; swap(&a[i], &a[j]); } } swap(&a[i+1], &a[last]); return (i + 1); } //利用递归排序 void quick_sort(int a[], int begin, int last) { if (begin < last) { int q = partition(a, begin, last); quick_sort(a, begin, q-1); quick_sort(a, q + 1, last); } } int main() { int i; int a[] = { 88, 1, 22, 99, 55, 77, 33, 66, 44, 70 }; cout << "After the quick sort,the data is:" << endl; quick_sort(a, 0, 9); for (const auto i : a) cout << i << " "; cout << endl; return 0; }
相关文章推荐
- 算法导论------------桶排序算法之研究
- 算法导论第二章问题研究
- 经典算法研究系列:五、红黑树算法的实现与剖析
- 广告转化率预估算法研究
- 【算法导论】递归式求解的三种方法
- 基于WGS和CBC测序策略的DNA序列拼接算法研究(五)
- 算法导论15章 动态规划之矩阵链乘法问题
- 程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大系列集锦
- 算法导论5.1-3解析
- 【算法导论】堆排序和优先级队列
- 图像算法---基于局部均值的锐化算法研究
- 堆排序--算法导论
- 放弃去FBI的机会,在美做了2年数据研究工作,如今回国创业,他把全球最顶级的智能预测算法带到了国内
- TList 的 quicksort 算法研究和使用。
- [算法导论]第七章《快速排序》
- 算法导论 | 第23章 最小生成树
- 算法设计——问一个算法题(算法导论的作业题) (转载自水木清华Programming)
- [算法导论 第2章]归并排序
- 论文笔记2《决策树分类优化算法的研究---(下)》
- 【算法导论】 第十课 平衡搜索树