基于分治法的快速排序和归并排序
来源:互联网 发布:c语言node类型 编辑:程序博客网 时间:2024/06/03 23:43
归并排序
1) 把前一半排序
2) 把后一半排序
3) 把两半归并到一个新的有序数组,然后再拷贝回原数组,排序完成。
每一个子过程都进行归并排序,整体用分治的思想(递归实现)
时间复杂度为O(nlogn)
是最快的排序算法!
/*函数mergeayyar()是归并排序算法函数mergesort()是对每个子过程进行归并排序,最后合并成最终的数组此算法理解分治的思想不难,关键是搞清楚递归是如何实现分治的 也是此类算法的关键 */ #include<iostream>using namespace std;//归并 void mergearray(int a[],int first,int mid,int end,int temp[]){ int i=0,j=0,k=0,m=0,n=0; i=first; j=mid+1; n=mid; while(i<=n&&j<=end){ if(a[i]<a[j]){ temp[k]=a[i]; i++; }else{ temp[k]=a[j]; j++; } k++; } while(i<=n||j<=end){ if(i<=n){ temp[k]=a[i]; i++; }else if(j<=end){ temp[k]=a[j]; j++; } k++; } for(int t=0;t<end-first+1;t++){ a[first+t]=temp[t]; }} //排序 void mergesort(int a[],int first,int end,int temp[]){ if(first<end){ int mid=first+(end-first)/2; mergesort(a,first,mid,temp); mergesort(a,mid+1,end,temp); mergearray(a,first,mid,end,temp); }}//test int main(){ int a[7]={25,57,48,37,12,92,86}; int n=7; int *p=new int[n]; mergesort(a,0,n-1,p); for(int t=0;t<n;t++){ cout<<a[t]<<" "; } delete [] p; cout<<endl; return 0;}
快速排序
1)设k=a[0], 将k挪到适当位置,使得比k小的元素都在k左边,比k大的元素都在k右边,和k相等的,不关心在k左右出现均可 (O(n)时间完成)
2) 把k左边的部分快速排序
3) 把k右边的部分快速排序
时间复杂度O(nlogn)
速度也很快!
感觉这个比归并排序好理解一点…
/*快速排序很好理解关键是分析透如何排序就好了这个程序不是最好的代码结构,不过是笔者自己解的,所以不想借鉴网上的多数的那个while循环的结构 */#include<iostream>using namespace std;//快速排序int quickArray(int a[],int first,int end,int n){ int x=a[first]; int i=first,j=end; int k=first; while(i<=j){ if(x>a[j]&&k<j){ a[k]=a[j]; a[j]=x; k=j; } if(a[i]>x&&k>i){ a[k]=a[i]; a[i]=x; k=i; } j--; i++; } return k;}//递归void quickSort(int a[],int first,int end,int n){ if(first<end){ int k=quickArray(a,first,end,n); quickSort(a,first,k-1,n); quickSort(a,k+1,end,n); }}//testint main(){ int a[8]={7,1,3,8,12,11,2,9}; int n=sizeof(a)/sizeof(int); quickSort(a,0,n-1,n); for(int i=0;i<n;i++){ cout<<a[i]<<" "; } cout<<endl; return 0;}
编译器中自带快速排序函数qsort(),具体用法自行google
阅读全文
0 0
- 基于分治法的快速排序和归并排序
- 分治法-基于分之策略的归并排序和快速排序
- 分治法在归并排序和快速排序中的应用
- 分治法(归并排序、快速排序)
- 【算法】分治法(快速排序,归并排序)
- 快速排序基于分治法的思想
- 【基于归并排序的分治】统计问题
- 分治之归并,快速排序
- 【分治算法】归并排序,快速排序和汉诺塔
- 分治法,归并排序
- 分治法-归并排序
- 分治法-归并排序
- 归并排序-分治法
- 分治法 - 归并排序
- 分治法--归并排序
- 归并排序 分治法
- 归并排序--分治法
- 分治法 & 归并排序
- [笔记分享] [Tools] QPST使用过程
- 驱动开发技术分享
- 【poj3061】Subsequence
- Centos6.3安装OpenStack的Folsom版本
- Docker 学习笔记
- 基于分治法的快速排序和归并排序
- 对集合中的对象分组,并排序
- 【Java】内存区域与对象创建
- 微信 退款 java
- mongodb crud 之 query
- git常用命令整理
- IDEA启动WEB项目访问Controller一直提示错误:No mapping found for HTTP request with URI [xxxx] in DispatcherServlet
- 算法竞赛入门经典 第三章习题题解(二)
- POJ3177