排序技术综合应用_第1页
排序技术综合应用_第2页
排序技术综合应用_第3页
排序技术综合应用_第4页
排序技术综合应用_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、-. z算法与数据构造实验报告实验题目:排序技术综合应用1、实验目的:1熟练掌握常用的排序方法,并掌握用高级语言实现排序算法的方法;2深刻理解排序的定义和各种排序方法的特点,并能加以灵活应用;3了解各种方法的排序过程及其依据的原则,并掌握各种排序方法的时间复杂度的分析方法。2、实验容:对希尔排序、快速排序、归并排序任意选择两种排序方法进展比拟。任意选择希尔排序、快速排序、归并排序中两种排序方法,对任意给定一组数据:单增、单减、乱码等,对它们进展比拟分析。3、实验说明:希尔排序算法如下:void ShellSort(int r , int n)for (d=n/2; d=1; d=d/2) /以

2、增量为d进展直接插入排序for (i=d+1; i0 & r0rj; j=j-d) rj+d=rj; /记录后移d个位置 rj+d=r0; void QuickSort(int r , int first, int end) if (firstend) /递归完毕 pivot=Partition(r, first, end); /一次划分 QuickSort(r, first, pivot-1); /递归地对左侧子序列进展快速排序 QuickSort(r, pivot+1, end); /递归地对右侧子序列进展快速排序 int Partition(int r , int first, int

3、end)i=first; j=end; /初始化while (ij) while (ij & ri= rj) j-; /右侧扫描 if (ij) rirj; /将较小记录交换到前面 i+; while (ij & ri= rj) i+; /左侧扫描if (ij) rjri; /将较大记录交换到后面 j-; retutn i; /i为轴值记录的最终位置快速排序算法如下:void QuickSort(int r , int first, int end) if (firstend) /递归完毕 pivot=Partition(r, first, end); /一次划分 QuickSort(r, f

4、irst, pivot-1); /递归地对左侧子序列进展快速排序 QuickSort(r, pivot+1, end); /递归地对右侧子序列进展快速排序 int Partition(int r , int first, int end)i=first; j=end; /初始化while (ij) while (ij & ri= rj) j-; /右侧扫描 if (ij) rirj; /将较小记录交换到前面 i+; while (ij & ri= rj) i+; /左侧扫描if (ij) rjri; /将较大记录交换到后面 j-; retutn i; /i为轴值记录的最终位置设计分析:希尔排序

5、输入:数组名称也就是数组首地址、数组中元素个数算法思想简单描述:在直接插入排序算法中,每次插入一个数,使有序序列只增加1个节点,并对插入下一个数没有提供任何帮助。如果比拟相隔较远距离称为增量的数,使得数移动时能跨过多个元素,则进展一次比拟就可能消除多个元素交换。D.L.shell于1959年在以他名字命名的排序算法中实现了这一思想。算法先将要排序的一组数按*个增量d分成假设干组,每组中记录的下标相差d.对每组中全部元素进展排序,然后再用一个较小的增量对它进展,在每组中再进展排序。当增量减到1时,整个要排序的数被分成一组,排序完成。下面的函数是一个希尔排序算法的一个实现,初次取序列的一半为增量,

6、以后每次减半,直到增量为1。希尔排序是不稳定的。快速排序输入:数组名称也就是数组首地址、数组中起止元素的下标算法思想简单描述:快速排序是对冒泡排序的一种本质改良。它的根本思想是通过一趟扫描后,使得排序序列的长度能大幅度地减少。在冒泡排序中,一次扫描只能确保最大数值的数移到正确位置,而待排序序列的长度可能只减少1。快速排序通过一趟扫描,就能确保*个数以它为基准点吧的左边各数都比它小,右边各数都比它大。然后又用同样的方法处理它左右两边的数,直到基准点的左右只有一个元素为止。它是由C.A.R.Hoare于1962年提出的。显然快速排序可以用递归实现,当然也可以用栈化解递归实现。下面的函数是用递归实现

7、的,有兴趣的朋友可以改成非递归的。快速排序是不稳定的。最理想情况算法时间复杂度O(nlog2n),最坏O(n2)-n的平方源程序代码:希尔排序*includeusing namespace std;*define Ma* 20typedef int keytype;struct retypekeytype key;char ch;struct sqlistretype rMa*+1;int len;/初始化数据void creatsqlist(sqlist &L, int n)int i=1;L.len=0;if(nMa* | n0)e*it(0);cout请输入数据:endl;for(i;

8、i=n; i+)cout请输入第个i个整数endl;cout请输入字符:L.ri.ch;cout输入的数据如下:L.ri.key;L.len+;/输出数据void outputsqlist(sqlist L)int i=1;for(i;i=L.len;i+) cout数据:iendl; cout字符=L.ri.ch * 数=L.ri.keyendl;/希尔排序void shellinsert(sqlist &L, int d);/对顺序表L进展一次希尔插入排序void shellsort(sqlist &L)int d=L.len/2;while(d!=0)shellinsert(L,d);d

9、=d/2;void shellinsert(sqlist &L, int d)int i=d+1;for(i; i=L.len; +i)if(L.ri.key0) & (L.r0.keyL.rj.key); j=j-d)L.rj+d=L.rj;/L.rj+d.ch=L.rj.ch; /L.rj+d.key=L.rj.key; L.rj+d=L.r0;/L.rj+d.ch=L.r0.ch;/L.rj+d.key=L.r0.key;int partition(sqlist &L, int low, int high)L.r0=L.rlow; /用区间第low个记录作枢轴记录keytype pivo

10、key=L.rlow.key; /取枢轴记录关键字while(lowhigh) /从区间两端交替地向中间扫描 while(low=pivokey) -high; /从左向右扫描L.rlow=L.rhigh; /比枢轴小的记录移到左端while(lowhigh)&(L.rlow.key=pivokey)+low; /从右向左扫描L.rhigh=L.rlow; /比枢轴记录大的移到右端L.rlow=L.r0; /枢轴记录到位return low; /返回枢轴位置void main()sqlist L;int n;cout请输入顺序表的长度(大于0):n; creatsqlist(L,n);cout

11、排序前输出数据:endl; outputsqlist(L);shellsort(L);cout排序后输出数据:endl; outputsqlist(L);快速排序*includeusing namespace std;*define Ma* 20typedef int keytype;struct retypekeytype key;char ch;struct sqlistretype rMa*+1;int len;/初始化数据void creatsqlist(sqlist &L, int n)int i=1;L.len=0;if(nMa* | n0)e*it(0);cout请输入数据:en

12、dl;for(i; i=n; i+)cout请输入第个i个整数endl;cout请输入字符:L.ri.ch;cout输入的数据如下:L.ri.key;L.len+;/输出数据void outputsqlist(sqlist L)int i=1;for(i;i=L.len;i+) cout数据:iendl; cout字符=L.ri.ch * 数=L.ri.keyendl;void qsort(sqlist &L, int low, int high);/顺序表L的子序列L.rlow.high进展快速排序int partition(sqlist &L, int low, int high);/交换

13、顺序表L的子序列L.rlow.high的记录void quiksort(sqlist &L) qsort(L,1,L.len); /排序整个文件记录void qsort(sqlist &L, int low, int high)if(lowhigh)int pivotpos=partition(L,low,high);/pivotpos曲轴位置 qsort(L,low, pivotpos-1); /对左区间递归排序qsort(L,pivotpos+1, high); /对右区间递归排序int partition(sqlist &L, int low, int high)L.r0=L.rlow;

14、 /用区间第low个记录作枢轴记录keytype pivokey=L.rlow.key; /取枢轴记录关键字while(lowhigh) /从区间两端交替地向中间扫描 while(low=pivokey) -high; /从左向右扫描L.rlow=L.rhigh; /比枢轴小的记录移到左端while(lowhigh)&(L.rlow.key=pivokey)+low; /从右向左扫描L.rhigh=L.rlow; /比枢轴记录大的移到右端L.rlow=L.r0; /枢轴记录到位return low; /返回枢轴位置void main()sqlist L;int n;cout请输入顺序表的长度(大于0):n; creatsqlist(L,n);cout排序前输出数据:endl; outputsqlist(L);cout排序后输出数据:endl; outputsqlist(L);测试用例希尔排序快速排序实验总结通过这次的实验,我掌握了几种常用的排序方法,并掌握用高级语言实现排序算法的方法;深刻理解排序的定义和各种排序方法的特点,并能加以灵活应用;了解各种

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论