![快速排序与合并排序的分析与比较_第1页](http://file3.renrendoc.com/fileroot_temp3/2022-1/19/057b14de-34bd-4458-a867-88445608f54b/057b14de-34bd-4458-a867-88445608f54b1.gif)
![快速排序与合并排序的分析与比较_第2页](http://file3.renrendoc.com/fileroot_temp3/2022-1/19/057b14de-34bd-4458-a867-88445608f54b/057b14de-34bd-4458-a867-88445608f54b2.gif)
![快速排序与合并排序的分析与比较_第3页](http://file3.renrendoc.com/fileroot_temp3/2022-1/19/057b14de-34bd-4458-a867-88445608f54b/057b14de-34bd-4458-a867-88445608f54b3.gif)
![快速排序与合并排序的分析与比较_第4页](http://file3.renrendoc.com/fileroot_temp3/2022-1/19/057b14de-34bd-4458-a867-88445608f54b/057b14de-34bd-4458-a867-88445608f54b4.gif)
![快速排序与合并排序的分析与比较_第5页](http://file3.renrendoc.com/fileroot_temp3/2022-1/19/057b14de-34bd-4458-a867-88445608f54b/057b14de-34bd-4458-a867-88445608f54b5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、快速排序与合并排序的分析与比较1 快速排序1.1 算法概述快速排序算法基于分治策略,算法的基本思路是以ap为基准把ap:r划分成3段ap:q-1,aq,aq+1:r,使得ap:q-1中任何元素小于等于aq,aq+1:r中任何元素大于等于aq.然后通过递归,分别对ap:q-1和aq+1:r进行排序,即形成排好序的ap:r队列.1.2 伪代码描述(参考书本)排序函数:递归实现排序void qSort(int p,int r) if(p<r)qSort(p,q-1); /对左半段排序qSort(q+1,r);划分函数:确定基准元素ap对ap:r进行划分int partition(int p,i
2、nt r) int i=p,j=r+1,temp,x=ap;while(true)while(a+i<ap&&i<r); /小于ap的元素放到左边区域while(a-j>ap); /大于ap的元素放到右边区域if(i>=j)break; /循环至i>=j时结束else int temp=ai; /满足条件就交换数据ai=aj;aj=temp;ap=aj; /while循环结束时满足ap:q-1中元素不大于aq+1:r中元素 aj=x;return j; /算法结束时返回划分点j,再由qSort递归/对右半段排序 int q=partition(p,
3、r); /确定基准元素对数组的划分1.3 复杂度分析对于输入序列ap:r,算法partition的计算时间为O(r-p-1),而快速排序的运行时间与划分是否对称有关.最环的情况是两个区域分别包含n-1和1个元素的情况,此时T(n)=O(n),而最好情况下每次划分所取的基准恰好为中值,此时partition的计算时间T(n)2在n大于1时满足T(n)=2T(n/2)+O(n),解为T(n)=O(nlogn).因此快速排序算法在平均情况下的时间复杂度也是O(nlogn).1.4 实验源代码#include <cstdlib>#include <iostream>#inclu
4、de <time.h>using namespace std;int partition(int *a,int p,int r) /划分函数确定基准元素ap对ap:r进行划分 int i=p;int j=r+1;int temp;int x=ap;while(true)while(a+i<ap&&i<r);while(a-j>ap);if(i>=j)break;elseint temp=ai;ai=aj;aj=temp;ap=aj;aj=x;return j;void qSort(int *a,int p,int r) /排序函数,递归实现排
5、序if(p<r)int q=partition(a,p,r);qSort(a,p,q-1);qSort(a,q+1,r);int main()clock_t start,finish;int INPUT,NUM,i,x;void randomize();cout<<" 数字大小上限: "cin>>INPUT;cout<<endl<<" 数列元素个数: "cin>>NUM;int *k=new intNUM;cout<<endl<<" 随机数列生成: &qu
6、ot;<<endl;for (i=0;i<NUM;i+)*(k+i)=rand()%(INPUT-1);cout<<*(k+i)<<"t"start=clock(); /时间计数qSort(k,0,NUM-1);cout<<" 排序后数列: "<<endl;for (i=0;i<NUM;i+)cout<<*(k+i)<<"t" /执行算法输出后结束计时 finish=clock();cout<<endl<<"
7、; 用时为:"<<(double)(finish-start)/CLK_TCK<<"秒."<<endl; system("PAUSE");return EXIT_SUCCESS;1.5 实验结果实验截图所示:2 合并排序2.1 算法概述合并排序也采用了分治的策略,将带排序的集合一分为二,直至待排序的集合只剩下一个元素为止.然后不断合并2个排好序的数据段,直至排好整个序列.另外,以此延伸的自然合并排序法则是先用一次线性扫描找出所有已排好序的字数组段,然后将相邻的字数组段两两合并,构成更大的已排好序的子数组段,直
8、至整个序列排好.2.2 伪代码描述合并函数1:合并cl:m和cm+l:r到dl:rvoid merge(int *c,int *d,int l,int m,int r) int i=l;int j=m+1;int k=l;while(i<=m)&&(j<=r) /cl:m和cm+l:r中数据开始比较 if(ci<=cj)dk+=ci+; /小的排在dk数列的前边 elsedk+=cj+; /大的排在后边if(i>m) /将cm+l:r中剩下的元素移入dkfor(int q=j;q<=r;q+)dk+=cq;else /将cl:m中剩下的元素移入dk
9、for(int q=i;q<=m;q+)dk+=cq;合并函数2:合并相邻大小为s的子数组void mergePass(int *x,int *y,int s,int n) /n为数组总长度 int i=0;while(i<=n-2*s) /数组够长的情况下,合并2个大小为s的相邻数组 merge(x,y,i,i+s-1,i+2*s-1);i=i+2*s;if(i+s<n) /所剩元素少于2s的情况merge(x,y,i,i+s-1,n-1);elsefor(int j=i;j<n;j+) /排序后复制到yyj=xj;合并函数3:合并排序算法void mergeSort
10、(int *a,int n)int *b=new int n; /动态分配一个一样大空间的b数组int s=1; /从大小为1开始合并while(s<n)mergePass(a,b,s,n);s+=s; /合并大小为s的相邻数组放在b中 mergePass(b,a,s,n); /合并到数组as+=s;2.3 复杂度分析对于n个元素的数组,一趟合并排序的过程如右图所示,一趟下来相邻长度为s的有序数组归并进行了|n2s|次,整个归并排序需进行|logn|趟.因此其时间复杂度可以算出为O(nlogn).2.4 实验源代码#include <cstdlib>#include <
11、iostream>#include <time.h>using namespace std;void merge(int *c,int *d,int l,int m,int r)int i=l;int j=m+1;int k=l;while(i<=m)&&(j<=r)if(ci<=cj)dk+=ci+;elsedk+=cj+;if(i>m)for(int q=j;q<=r;q+)dk+=cq;elsefor(int q=i;q<=m;q+)dk+=cq;void mergePass(int *x,int *y,int s,i
12、nt n)int i=0;while(i<=n-2*s)merge(x,y,i,i+s-1,i+2*s-1);i=i+2*s;if(i+s<n)merge(x,y,i,i+s-1,n-1);elsefor(int j=i;j<n;j+)yj=xj;void mergeSort(int *a,int n)int *b=new int n;int s=1;while(s<n)mergePass(a,b,s,n);s+=s;mergePass(b,a,s,n);s+=s;int main()clock_t start,finish; int INPUT,NUM,i,x;voi
13、d randomize(); cout<<" 数字大小上限: "cin>>INPUT; cout<<endl<<" 数列元素个数: "cin>>NUM; int *k=new intNUM; cout<<endl<<" 随机数列生成: "<<endl; for (i=0;i<NUM;i+)*(k+i)=rand()%(INPUT-1); cout<<*(k+i)<<"t"start=cloc
14、k(); mergeSort(k,NUM);cout<<" 排序后数列: "<<endl; for (i=0;i<NUM;i+)cout<<*(k+i)<<"t"finish=clock();cout<<endl<<" 用时为:"<<(double)(finish-start)/CLK_TCK<<"秒."<<endl; system("PAUSE");return 0;2.5 实验结
15、果实验截图所示:3 结果比较为了方便比较,我将两个排序算法合并到一个程序中,让他们使用同一组随机生成的数组排序.同时考虑到数列元素个数很多时,大量的输出十分影响程序执行的时间,因此在原程序上做了一些修改,取消了数列的输出,而只在屏幕上显示两种排序后所用的时间. .for (i=0;i<NUM;i+) *(k+i)=rand()%(INPUT-1);*(k1+i)=*(k+i); cout<<endl<<" 随机数列生成!"<<endl;start=clock();mergeSort(k,NUM); /合并排序finish=clock();cout<<endl<<" 合并排序用时为:"<<(double)(finish-start)/CLK_TCK<<"秒."<<endl;start=clock();qSort(k1,0,NUM-1); /快速排序finish=clock();cout<<endl<<" 快速排序用时为:"<<(double)(finis
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- Trilysine-TFA-生命科学试剂-MCE-4187
- KIF18A-IN-15-生命科学试剂-MCE-5317
- 4-4-Dimethoxyoctafluorobiphenyl-生命科学试剂-MCE-5198
- 1-3-Dinervonoyl-glycerol-生命科学试剂-MCE-1243
- 2025年度特色民宿体验住宿协议
- 二零二五年度消防设备定制设计与销售合同
- 二零二五年度农产品线上线下一体化购销合同标准
- 施工现场施工防传染病传播制度
- 个人兼职用工合同模板
- 乡村别墅租赁合同样本
- 《奥特莱斯业态浅析》课件
- 2022年湖南省公务员录用考试《申论》真题(县乡卷)及答案解析
- 国家安全教育课程教学大纲分享
- 养殖场兽医服务合同
- 电气工程及其自动化基础知识单选题100道及答案解析
- HR六大板块+三支柱体系
- 慢性病患者门诊身份管理方案
- 2025年高考英语一轮复习讲义(新高考)第2部分语法第23讲状语从句(练习)(学生版+解析)
- 连铸工职业技能大赛考试题库-上(单选、多选题)
- 2024年全国统一高考数学试卷(新高考Ⅱ)含答案
- 十七个岗位安全操作规程手册
评论
0/150
提交评论