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

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

实验目的

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


实验内容

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


实验过程

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


相关文章
|
3月前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
95 4
|
3月前
|
机器学习/深度学习 缓存 算法
Python算法设计中的时间复杂度与空间复杂度,你真的理解对了吗?
【10月更文挑战第4天】在Python编程中,算法的设计与优化至关重要,尤其在数据处理、科学计算及机器学习领域。本文探讨了评估算法性能的核心指标——时间复杂度和空间复杂度。通过详细解释两者的概念,并提供快速排序和字符串反转的示例代码,帮助读者深入理解这些概念。同时,文章还讨论了如何在实际应用中平衡时间和空间复杂度,以实现最优性能。
86 6
|
10天前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
24 6
|
3月前
|
搜索推荐 算法
插入排序算法的平均时间复杂度解析
【10月更文挑战第12天】 插入排序是一种简单直观的排序算法,通过不断将未排序元素插入到已排序部分的合适位置来完成排序。其平均时间复杂度为$O(n^2)$,适用于小规模或部分有序的数据。尽管效率不高,但在特定场景下仍具优势。
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
65 1
|
3月前
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
50 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
3月前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
3月前
|
算法
PID算法原理分析
【10月更文挑战第12天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
|
3月前
|
算法
PID算法原理分析及优化
【10月更文挑战第6天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
|
3月前
|
算法 安全 Go
Python与Go语言中的哈希算法实现及对比分析
Python与Go语言中的哈希算法实现及对比分析
52 0

热门文章

最新文章