作业444

实验报告

课程名称 《算法分析与设计》
实验日期 2021年 3 月 29 日 至 2021年 4 月 04日

实验名称 实验四:二分归并排序
实验地点 同组人员 无

  1. 问题
    二分归并排序:对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k

  2. 解析
    归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序是一种稳定的排序方法。
    以中间的数为基准,每次排序都将比它小的数放在前面,将比它大的数放在后面。

  3. 设计
    [核心伪代码]
    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);}
    }

  4. 分析
    [算法复杂度推导]
    由上伪代码设计可得,merge函数中最坏情况为n次,而mergesort函数中二分递归最坏情况为logn次,所以估计该算法时间复杂度为O(n*logn)。

  5. [github源码地址]
    https://github.com/zjk715/–homework

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值