栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

直接插入排序(C语言)[测试数据随机生成+计算程序运行时间+算法效率分析]

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

直接插入排序(C语言)[测试数据随机生成+计算程序运行时间+算法效率分析]

直接插入排序,使用C语言实现。

这里为了方便测试面对大量数据时直接插入排序算法的运行时间,通过宏定义来设定生成随机数的数量(即参与排序的数据数量),利用rand()函数生成随机数,便于生成大量数据,并且通过srand()函数保证每次编译运行生成的随机数不同,使用中的clock()来计时。

代码中,使用arr[0]临时存放待排序的那个元素(即判断是否要插入的那个数), 从arr[1]开始存放随机数。

实现代码

代码实现如下:

#include 
#include  //生成随机数rand()
#include   //用到clock()函数计时 ,利用srand()设置随机数种子 
#define N 10000    //宏定义,定义生成随机数的数量


//直接插入排序 
void InsertionSort(int* A, int n)
{
    int key;				//待排序的数(要插入的数)
    int i, j;
    for (j = 2; j <= n; j++)
    {
        key = A[j];
        i = j - 1;
        while (i > 0 && A[i] > key) {
            A[i + 1] = A[i];	//大于key,向右移 
            i--;
        }
        A[i + 1] = key;	        //小于key,在其后插入key 
    }
}

int main()
{
    int* arr = (int*)malloc(sizeof(int) * N);
    int i;
    clock_t startTime, endTime;//该时间计算以ms为单位 
    printf("生成的随机数如下:n");
    srand((unsigned)time(NULL));	//设置随机数种子 (此处以时间作为参数,因为每次生成随机数的时间不同,每次生成的随机数也就不同)

    for (i = 1; i <= N; i++) {   		//arr[0]临时存放要插入的数 
        arr[i] = rand() % 10000000 + 10;      //生成10~10000010间的随机数,从arr[1]开始存放随机数    
        printf("%d ", arr[i]);
    }
    printf("n排序后的数如下:n");
    startTime = clock();				//计时开始
    InsertionSort(arr, N);   //调用排序函数,生成有序数组 
    endTime = clock();				//计时结束
    for (i = 1; i <= N; i++)
        printf("%d ", arr[i]);



    //计算运行时间 
    printf("n直接插入排序-Running Time:%dn", endTime - startTime);
    
}
运行示例:

N=10000

时间复杂度分析

        最好情况——顺序输入

                顺序排列时,需比较(n-1)次——时间复杂度为:

        最坏情况 ——逆序输入

                需比较n(n-1)/2次——时间复杂度为:

        平均情况——时间复杂度为:

空间复杂度分析

        直接插入排序过程需要一个临时空间存储待排序元素,这里的arr[0]用来储存待排序元素,因此,空间复杂度为:

算法稳定性

        插入排序是一种稳定的排序算法。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/835499.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号