数据结构实验-归并排序算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

大连理工大学实验预习报告

学院(系):电信专业:班级:

姓名:学号:组:___

实验时间:实验室:实验台:

指导教师签字:成绩:

实验名称Merge sort

一、实验目的和要求

(一)、实验目的

Design the merge sort algorithm and implement it in C language

设计归并排序算法并于C语言实现。

(二)、实验要求

Requirements:

1) Analyze the time complexity of your algorithm

2) Submit the document explaining your algorithm as well as the source code.

要求:

1)分析算法的时间复杂度。

2) 提交的文档中说明你的算法和源代码。

二、实验原理

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可

解决了上面的合并有序数列问题,再来看归并排序,其的基本思路就是将数组分成二组A,B,如果这二组组内的数据都是有序的,那么就可以很方便的将这二组数据进行排序。如何让这二组组内数据有序了?

可以将A,B组各自再分成二组。依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了。这样通过先递归的分解数列,再合并数列就完成了归并排序。

大连理工大学实验报告

学院(系):电信专业:电创班级:1501

姓名:陈晓牛津学号:201588011 组:___

实验时间:2017/4/18 实验室:实验台:

指导教师签字:成绩:

实验名称Mergesort

一、算法分析

归并组合

功能:

用二分检索查找的方法采用从低部分,高部分进行查找建立一个新的数组,将小的数放入新的数组中。

归并排序

功能;利用递归进行排序,先查找中点位置,再对前部分查找,然后后部分,将小的数据放入新的数组

二、关键代码及注释

void mergesort(int *a,intleft,int right)

{

int mid;

if(left < right) /* 分组条件*/

{

mid = (left + right)/2; /* 取中点*/

mergesort(a,left,mid); /* 左边分组*/

mergesort(a,mid+1,right); /* 右边分组*/

partition(left,mid,right); /* 归并函数*/

}

三、运行结果

四、代码

#include

inta[]={70,66,88,70,45,90,33,66,70,22,11,90,11,90,11,90},k = 0; inti;

void mergesort(int *a, int left, int right);

void partition(int left, int mid, int right);

intmain()

{

printf("要排序的数组为:\n"); /* 输出要排序的数*/

for(i = 0; a[i] != NULL; i++)

{

printf("%4d",a[i]);

}

printf("\n");

mergesort(a,0,15); /* 归并排序*/

printf("则结果为:\n");

for(i = 0; a[i] != NULL; i++) /* 经过排序之后输出数组a */ {

printf("%4d",a[i]);

}

printf("\n");

}

void mergesort(int *a,intleft,int right)

{

int mid;

if(left < right) /* 分组条件*/

{

mid = (left + right)/2; /* 取中点*/

mergesort(a,left,mid); /* 左边分组*/

mergesort(a,mid+1,right); /* 右边分组*/

partition(left,mid,right); /* 归并函数*/

}

}

void partition(intleft,intmid,int right) /* 归并的函数定义*/

{

int h = 0, l = left, m = mid + 1, j = 0,b[20]; /* 定义变量为了保证a左右下标不改变,b作为辅助数组,存放归并的后的元素*/

while(right >= m && l < mid+1) /* 终止条件为数组元素用尽*/

{

if(a[l] < a[m]) /* 如果左边的小,则将左边的元素赋值给b */

{

b[h++] = a[l++];

}

else /* 否则将右边元素赋值给b */

{

b[h++] = a[m++];

}

}

if(right < m) /* 如果右边的元素用完,则将左边的元素全部赋值给数组b,完成一趟排序*/

{

for(; l <= mid; l++)

{

b[h++] = a[l];

}

}

else if(l > mid) /* 如果是左边的用完,则同理将右边的全部赋值给数组b */

{

for(; m <= right; m++)

{

b[h++] = a[m];

}

相关文档
最新文档