算法的时间复杂度和空间复杂度分析

简介: 实验目的实验内容实验过程运行结果复杂度分析

实验目的

通过本次实验,了解算法复杂度的分析方法,掌握递归算法时间复杂度的递推计算过程。


实验内容

二路归并排序的算法设计和复杂度分析。


实验过程

1.算法设计

归并排序:是指将两个或两个以上的的有序序列合并成一个有序序列。

排序思想:

(1)将每一个数据看成一个单独的有序序列,则n个待排序数据就是n个长度唯一的有序子序列;

(2)对所有有序子序列进行两两归并,得到n/2个长度为1或2的有序子序列–这这为一趟归并;

(3)重复(2),直到得到长度为n的有序序列为止。

上述排序过程中,子序列总是两两归并,极为二路归并排序。这算法设计的重点是如何将相邻的两个子序列归并成一个子序列。

算法实验原理:

1、申请一个和原始排序数组空间一样大的额外数组。

2、定义归并初始长度 length。

3、将数组分块。

4、将分块数组进行排序,把数据存入额外一个数组。(下一次用额外数组排序,数据存入原始数组,轮流存储)

5、增加归并长度 length*2。

6、重复3-5步,即可得到排序。

2.程序清单


#include <stdio.h>
#include <stdlib.h>
// 将a[s...m]和a[m+1...e]两个有序子序列归并为有序
// 归并后的序列存放数组b中 
void merge(int a[], int s, int m, int e)
{
    int i,j,k;
    // 申请临时空间存放有序序列
    int *b = (int *)malloc(sizeof(int)*(e-s+1));
    for(i=m+1,k=0,j=s; j<=m && i<=e; ++k)
    {
        if(a[j] <= a[i])
            b[k] = a[j++];
        else
            b[k] = a[i++];
    }
    while(j<=m)
    {
        b[k] = a[j];
        k++;
        j++;
    }
    while(i<=e)
    {
        b[k] = a[i];
        k++;
        i++;
    }
    // 排序完成后,复制到原数组a
    for(i=s,k=0; i<=e; i++,k++)
        a[i] = b[k];
    free(b);
}
// 对a[s...e]序列进行归并排序 
void msort(int a[], int s, int e)
{
    if (s<e)
    {
        // 将整个序列一分为二
        int m = (s+e)/2;
        msort(a,s,m);
        msort(a,m+1,e);
        merge(a,s,m,e);
    }
}
void merge_sort(int a[], int length)
{
    msort(a,0,length-1);
}
int main(void)
{
    int a[10] = {4,3,1,2,6,5,0,9,8,7};
    merge_sort(a,10);
    int i;
    for(i=0; i<10; i++)
        printf("%d ", a[i]);
    return 0;
}


运行结果

34.png


35.png


复杂度分析


36.png


相关文章
|
15天前
|
人工智能 算法 BI
第一周算法设计与分析 D : 两面包夹芝士
这篇文章介绍了解决算法问题"两面包夹芝士"的方法,通过找出两个数组中的最大最小值,计算这两个值之间的整数个数,包括特判不存在整数的情况。
|
6天前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
|
15天前
|
算法
算法设计与分析作业
这篇文章是关于算法设计与分析的作业,其中包含了两个算法实现:一个是使用分治算法实现的十进制大整数相乘(包括加法、减法和乘法函数),并进行了正确性和健壮性测试;另一个是使用快速排序思想实现的分治查找第K小元素的程序,并分析了其平均和最坏时间复杂度。
算法设计与分析作业
|
10天前
|
编解码 算法 图形学
同一路RTSP|RTMP流如何同时回调YUV和RGB数据实现渲染和算法分析
我们播放RTSP|RTMP流,如果需要同时做渲染和算法分析的话,特别是渲染在上层实现(比如Unity),算法是python这种情况,拉两路流,更耗费带宽和性能,拉一路流,同时回调YUV和RGB数据也可以,但是更灵活的是本文提到的按需转算法期望的RGB数据,然后做算法处理
|
15天前
|
人工智能 算法
第一周算法设计与分析:C : 200和整数对之间的情缘
这篇文章介绍了解决算法问题"200和整数对之间的情缘"的方法,通过统计数组中每个数模200的余数,并计算每个同余类中数的组合数来找出所有满足条件的整数对(i, j),使得\( A_i - A_j \)是200的整数倍。
|
15天前
|
人工智能 算法
第一周算法设计与分析 G : 排队援救
这篇文章介绍了解决算法问题"排队援救"的方法,通过使用队列和映射来模拟救援点的排队过程,并确定最终得到救援的人的顺序和编号。
|
15天前
|
算法 C++
第一周算法设计与分析 E : 构造回文串
这篇文章介绍了解决算法问题"构造回文串"的方法,即判断给定的整数N(视为字符串)是否可以通过在前面添加任意个0(或不添加)来构造一个回文串,并给出了相应的C++代码实现。
|
15天前
|
算法 C++
第一周算法设计与分析 H : 括号匹配
这篇文章介绍了解决算法问题"括号匹配"的方法,通过使用栈来检查给定字符串中的括号是否合法匹配,并提供了相应的C++代码实现。
|
15天前
|
算法 C++
第一周算法设计与分析 F : 模拟计算器
该文章 "第一周算法设计与分析 F : 模拟计算器" 的摘要或讨论。这篇文章介绍了如何设计一个程序来模拟一个基本的计算器,处理包含加、减、乘运算的表达式,并给出了相应的C++代码实现
|
15天前
|
算法 关系型数据库 程序员
第一周算法设计与分析:B : 如何溜的最快
这篇文章提供了解决算法问题"如何溜的最快"的方法,即计算从原点(0,0)到任意点(x,y)所需的最短步数,每步长度固定为R,通过特判和计算总距离除以步长向上取整来确定步数。