《算法分析与设计》排序问题的答案

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;ix[j],则将二者进行大小交换,否则不交换。

通过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

相关文档
最新文档