快速排序和归并排序都是采用了分治法的策略
分治法是将大的问题逐渐分解成单位元素的问题,然后再从底层一个个子问题的合成为原来问题的解。能采用分治法的案例,子问题一定是互相独立的,即不存在重叠子问题。
1.快速排序
目标:输入一个数组a[p:r],并通过基准元素a[t](p<t<r)在a[p:t-1]中找到比a[t]小的元素和在a[t+1:r]中找到比a[t]大的元素,并按照顺序排列大小,即a[p:t-1]中的小者,a[t],a[t+1:r]中的大者。一般我们选用基准元素a[p],经过不停的查找就可以使得排序完成。
算法的时间特性和每次划分的对称性有关,如果每次都是划分在第一个位置,则算法复杂
T(n)=O(1),n=1;
T(n)=T(n-1)+O(n),n>1;
最好情况下,每次划分都很均匀
T(n)=O(1),n=1;
T(n)=2T(n/2)+O(n),n>1;
/* 快速排序程序模块 分治算法的案例 以中心点a[p]找出在p,到r中间的比a[p]小的和比a[p]大的并交换成所需的顺序 */ void swap(int a[],int i,int j) { int temp; temp=a[i]; a[i]=a[j]; a[j]=temp; } int partition(int a[],int p,int r) { int i=p; int j=r+1; int x=a[p]; while(1) { while(a[++i]<=x); while(a[--j]>=x); if(i>=j){ break; } swap(a,i,j); } a[p]=a[j]; a[j]=x; return j; } void quickSort(int a[],int p,int r) { if(p<r) { int q=partition(a,p,r); quickSort(a,p,q-1); quickSort(a,q+1,r); } }
改进方法:基准元素由随机数生成下标
2.归并排序
目标:将数组a[p:r]逐步对半分解,直到只剩下一个元素的时候它就是有序的数组,进而和另一个分解出来长度为1的数组进行合并,合并的时候排序,生成长度为2的有序数组,不断递归最后生成原问题的解:有序数组。
根据图解很容易就能明白。程序实现的过程中需要借助一个暂存数组b,在对a数组操作时候转到b数组的操作可以保证信息的不丢失,最后将排好的数组b复制到a的对应位置上,即可完成。
/* 归并排序程序模块 分成长度为1的数组,进而与另一个单元数组合并成2长度的数组并排序 */ void merge(int a[],int b[],int low,int mid,int high) { int s=low,t=mid+1,k=low; while(s<=mid && t<=high){ if(a[s]<a[t]){ b[k]=a[s]; s++; }else{ b[k]=a[t]; t++; } k++; } if(s==mid+1){ for(int i=k;i<=high;i++)b[i]=a[t++]; }else{ for(int i=k;i<=high;i++)b[i]=a[s++]; } for(int i=low;i<=high;i++)a[i]=b[i];//复制回原数组 } void mergeSort(int a[],int b[],int low,int high) { if(low<high){ int mid=(low+high)/2; mergeSort(a,b,low,mid); mergeSort(a,b,mid+1,high); merge(a,b,low,mid,high); } }
快速排序和归并排序是入门的时候比较难看懂的分治算法,比较起二分法的案例程序的结构更加抽象难懂,主要是递归之后结构变得复杂了。
相关推荐
算法设计实验报告,包括:快速排序和归并排序两种算法各自的基本思想、时间复杂度分析,C++实现代码,两种算法运行时间的比较,运行截图,实验心得。
选择排序、插入排序、冒泡排序以及快速排序和归并排序的C语言实现,绝对可用
快速排序、归并排序、基数排序等排序算法比较,比较时间性能,采用C++语言实现。。。
实现并验证合并排序算法; 实现并验证快速排序算法(参考习题5.2第7a题,P140); 用递归与分治的方法设计并实现寻找第k小元素算法
用matlab实现的快速排序以及归并排序
我最喜欢的排序算法 快速排序和归并排序.doc
自己编写的基于java的快速排序和归并算法
全面的排序算法实现,包括插入排序、合并排序、堆排序、快速排序。 堆排序:HeapSort 讲解详见http://blog.csdn.net/fly_yr/article/details/8550701 插入排序:InSertion_Sort 讲解详见...
插入排序、冒泡排序、归并排序、快速排序四种排序方式的C++实现,各写成了一个函数,主函数中可以选择调用那一个。初始化数组时用的是随机种子srand((int)time(0))。在宏中定义数组大小。
冒泡排序,选择排序,插入排序,希尔排序,堆排序,归并排序,快速排序源码实现,里面有详细讲解,对新手应该有帮助
插入排序、选择排序、希尔排序、堆排序、冒泡、双向冒泡、快速排序、归并排序、递归的归并排序、基数排序
快速排序、归并排序、堆排序 并比较排序时间 数据结构与算法
7大排序算法(快速排序,冒泡排序,选择排序,归并排序,插入排序,希尔排序,堆排序)实现源码
直接插入排序 选择排序 堆排序 归并排序 快速排序 冒泡排序等七种排序方法
自己写的三个排序算法的比较。快速排序、归并排序、简单排序 对三个排序算法所消耗时间进行统计,比较时间效率 程序是在Linux下用C写的,vc下并未做测试。
计算机算法课程的作业,用c++实现了归并排序和快速排序,并比较了两种算法的速度。测试数据为随机生成,可设置为10万、100万、1000万大小的数组。在代码中提供了详细的注释,在容易出错的地方进行了解释。下面是得到...
选择排序,冒泡排序,插入排序 基数排序,快速排序,归并排序
直接插入排序 冒泡排序 快速排序 直接选择排序 堆排序 二路归并排序 C#源代码 使用C#实现的数据结构中的排序算法
排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序.mht