插入排序算法并附上如何求出其时间复杂度

插入排序工作方式:就像许多人排序一手扑克牌一样。开始时,我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入到左手正确的位置。为了找到一张牌正确的位置,我们从右到左将它与已在左手的每张牌进行比较。

代码如下:

#include <stdio.h>
#include <stdlib.h>

void insert_sort(int *pArr, int iLow, int iHigh)
{
    for(int i = iLow + 1; i <= iHigh; i++)//第一个元素不需要比较,因此从第二个元素开始遍历
    {
		
		int key = pArr[i];
        int j = i - 1;
        while(j >= iLow && pArr[j] > key)
        {
            pArr[j + 1] = pArr[j];
            j--;
        }
		pArr[j + 1] = key;
    }
}

int main()
{
    int arr[] = {5,4,3,2,1};
    insert_sort(arr, 0, sizeof(arr)/sizeof(int) - 1);
    for(int i = 0; i <= sizeof(arr)/sizeof(int) - 1; i++)
    {
        printf("arr[%d]=%d\n", i, arr[i]);
    }
}

运行的结果如下:

插入排序的时间复杂度(为了方便解析截出主要代码):

因为求时间复杂度都是假设最坏的情况的,因此假设:

执行第6行的代价为c1,其一共执行n次。

执行第8~9行和第15行的代价为c2,其执行n - 1次。

执行第10行的代价为c3,其执行n*(n+1)/2 -1。

执行第12~13行的代价为c4,其执行n*(n-1)/2次。

则T(n) = c1*n + c2*(n -1) + c3*(n*(n+1)/2 - 1) +  c4*(n*(n-1)/2 ) =  ((c3+c4)/2)*n^2 + (c1 + c2 + c3/2 - c4/2)*n - (c3  + c4) =

所以:插入排序算法时间复杂度T(n) = a*n^2 + b*n +c = O(n^2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值