《算法分析与设计》排序问题的答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题一排序问题
一、设计目的
1.掌握各种排序的基本思想。
2.掌握各种排序方法的算法实现。
3.掌握各种排序方法的优劣分析及花费的时间的计算。
4.掌握各种排序方法所适应的不同场合。
二、设计内容和要求
利用随机函数产生3000个随机整数,利用选择排序、起泡排序、快速排序、合并排序(归并排序)等排序方法进行排序,并统计每一种排序上机所花费的时间。
参考答案
一、题一(排序问题)
二、运行环境(软、硬件环境)
编写程序:C语言
编译环境:VC++6.0
软件:Windows7 64位
硬件:华硕PC机
三、算法设计的思想
选择排序:
每一趟,从待排序的数据元素中,选出最小的一个元素,按顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
最终实现数据元素从小到大的排序。
起泡排序:
一次比较两个相邻的元素,如果第一个元素比第二个元素大,就将他们排序进行交换。
通过不断对要排序的数列走访,依次比较相邻两个元素大小,从开始的第一对到结尾的最后一对。最终完成数据从小到大的排序。
快速排序:
通过一趟排序,将要排序的数据分成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小。
再按上述方法对这两部分数据,分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
合并排序:
将两个及两个以上有序表,合并成一个新的有序表。
即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并在一起,形成整体有序序列。
四、算法的流程图
选择排序
返回,继续进行上一步
起泡排序
合并排序
五、算法设计分析
定义变量k,将数组第一个元素x[0](i=0;i 将每次选好的最小元素,按顺序放在已经排好的数列最后。最终,完成数据排列。 起泡排序 定义数组x,比较x[i](i=0;i 通过2个for循环,最终实现所有相邻数据进行比较,从第一对到最后一对。达到把乱序数据,实现由小到大的排列。 快速排序 定义数组x,变量i、j、k,选取参照k=x[(i+j)/2],从左到右找比键值k大的元素,从右到左找比键值k小的元素,将找到且满足条件的元素进行交换。 由上述过程,把比键值k大的元素存入大数组,比键值k小的元素存入小数组。对两部分数组的元素和键值k放回原数组,再次利用上述方法,运用递归,完成排序。 合并排序 首先,定义高位high,地位low,中点middle;开始,令h为前段下标,j 为后段下标,h=low,i=0,j=middle+1; 当h<=middle&&j<=high,如果x[h] 六、源代码 #include "stdio.h" #include "time.h" #include "malloc.h" #include "stdlib.h" void selectsort(int *x,int n) //选择排序 { int i,j,k,temp; for(i=0;i { k=i; /*给记号k赋值*/ for(j=i+1;j if(x[k]>x[j]) k=j; /*k总是指向最小元素*/ if(i!=k) { /*当k!=i是才交换,否则x[i]即为最小*/ temp=x[i]; x[i]=x[k]; /*x[i]与x[k]进行交换*/ x[k]=temp; } } } void bubble(int *x,int n) /*定义两个参数:数组首地址与数组大小*/ //起泡排序 { int i,j,temp; for(i=0;i for(j=i+1;j if(x[i]>x[j]) /*将x[i]与x[j],进行大小交换*/ { /*通过大小比较,每次选取一个最小值*/ temp=x[i]; x[i]=x[j]; x[j]=temp; } } void quick(int *x,int i,int j) //快速排序 { int m,n,temp; int k; m=i; n=j; k=x[(i+j)/2]; /*选取的参照*/ do { while(x[m] while(x[n]>k&&n>i) n--; /* 从右到左找比k小的元素*/ if(m<=n) { /*找到且满足条件,则交换*/ temp=x[m]; x[m]=x[n]; x[n]=temp; m++; n--; } } while(m<=n); if(m if(n>i) quick(x,i,n); } void merge(int x[],int low,int middle,int high) //合并排序 { //高位high,低位low,中位middle