实验报告
课程名称 《算法分析与设计》
实验日期 2021年 3 月 29 日 至 2021年 4 月 04日
实验名称 实验四:二分归并排序
实验地点 同组人员 无
-
问题
二分归并排序:对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k -
解析
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序是一种稳定的排序方法。
以中间的数为基准,每次排序都将比它小的数放在前面,将比它大的数放在后面。 -
设计
[核心伪代码]
void merge(int a[], int left, int mid, int right)
{
int i = left, j = mid + 1, k = left;
while (i != mid + 1 && j != right + 1) {
if (a[i] >= a[j]) b[k++] = a[j++];
else b[k++] = a[i++];
}
while (i != mid + 1) b[k++] = a[i++];
while (j != right + 1) b[k++] = a[j++];
for (i = left; i <= right; i++) a[i] = b[i];}
void mergesort(int a[], int left, int right) {
int mid;
if (left < right) {
mid = (left + right) / 2;
mergesort(a, left, mid);
mergesort(a, mid + 1, right);
merge(a, left, mid, right);}
} -
分析
[算法复杂度推导]
由上伪代码设计可得,merge函数中最坏情况为n次,而mergesort函数中二分递归最坏情况为logn次,所以估计该算法时间复杂度为O(n*logn)。 -
[github源码地址]
https://github.com/zjk715/–homework