跟着《算法导论》学习——快速排序
2013-12-21 16:22
155 查看
读前声明:本人所写帖子主要为了记录本人学习的一个过程,无他想法,由于内容比较肤浅,如有雷同,非常正常!!!
本文内容:
本文主要是参考《算法导论》这本书,完成部分算法编写,可能编程习惯或者风格比较差,还请多多批评。
快速排序是一种排序算法,对包含n个数的输入数组,最坏情况运行时间为O(n^2),虽然这个最坏情况运行时间比较差,但快速排序通常是用于排序的最佳实用选择,这是因为其平均性能相当好,期望的运行时间是O(nlgn),且O(nlgn)记号中的隐含的常数因子很小。另外,它还能够进行就地排序,在虚存环境中也能很好的工作。
像归并排序一样,快速排序也是基于分治法进行的,下面湿对一个典型子数组排序分治的三个步骤:
分解:数组A[p,...,r]被划分为两个子数组(可能为空)A[p,...,q-1]和A[q+1,...,r],使得A[p,...,q-1]中的每个元素都小于等于A[q],A[q]小于等于A[q+1,...,r]中的元素;
解决:递归调用快速排序,对子数组A[p,...,q-1]和A[q+1,...,r]排序;
合并:因为两个子数组都是就地排序的,将它们合并不需要操作,整个数组即也排好序。
代码如下:
上述代码中,含有一个非常重要的子函数,就是对数组进行重排过程,这一过程即是将参考值小的数移到数组左边,大的数移到数组右边,代码如下:
本文内容:
本文主要是参考《算法导论》这本书,完成部分算法编写,可能编程习惯或者风格比较差,还请多多批评。
快速排序是一种排序算法,对包含n个数的输入数组,最坏情况运行时间为O(n^2),虽然这个最坏情况运行时间比较差,但快速排序通常是用于排序的最佳实用选择,这是因为其平均性能相当好,期望的运行时间是O(nlgn),且O(nlgn)记号中的隐含的常数因子很小。另外,它还能够进行就地排序,在虚存环境中也能很好的工作。
像归并排序一样,快速排序也是基于分治法进行的,下面湿对一个典型子数组排序分治的三个步骤:
分解:数组A[p,...,r]被划分为两个子数组(可能为空)A[p,...,q-1]和A[q+1,...,r],使得A[p,...,q-1]中的每个元素都小于等于A[q],A[q]小于等于A[q+1,...,r]中的元素;
解决:递归调用快速排序,对子数组A[p,...,q-1]和A[q+1,...,r]排序;
合并:因为两个子数组都是就地排序的,将它们合并不需要操作,整个数组即也排好序。
代码如下:
void QuickSort(int a[],int left,int right) { if (left>=right) { return; } int p = Seperation(a,left,right); QuickSort(a,left,p); QuickSort(a,p+1,right); }
上述代码中,含有一个非常重要的子函数,就是对数组进行重排过程,这一过程即是将参考值小的数移到数组左边,大的数移到数组右边,代码如下:
int Seperation(int a[],int left,int right) { int temp = a[left]; int i = left; for (int j=left+1;j<=right;j++) { if (a[j]<temp) { i++; if (i!=j) { int t = a[j]; a[j] = a[i]; a[i] = t; } } } a[left] = a[i]; a[i] = temp; return i; }
相关文章推荐
- 《算法导论》学习摘要chapter-7——快速排序
- 算法导论学习笔记(五):快速排序
- 算法导论学习之快速排序
- 学习《算法导论》第七章 快速排序 总结
- 算法导论学习笔记-第7章 快速排序
- 算法导论 第7章 快速排序 学习总结
- 算法导论学习笔记(一)快速排序及优化
- 算法导论学习笔记 第7章 快速排序
- 算法导论学习--快速排序--Quicksort
- 《算法导论》笔记 第7章 7.1快速排序的描述
- 算法学习之分治--快速排序
- 《算法导论》笔记 第7章 7.3快速排序的随机化版本
- 《算法导论》学习之基数排序
- 算法第四版学习笔记之快速排序 QuickSort
- 算法学习之排序(5)--快速排序
- 《算法导论》第7章 快速排序 (四种变形)
- 算法导论 - QuickSort 快速排序 C++实现
- 算法导论-排序(二)快速排序、随机化快速排序
- 算法导论 - 快速排序的 C 语言实现
- 算法导论第7章快速排序