十大排序算法-插入排序 c语言实现

介绍

        插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

代码实现

#define PTR_MATH(base,i,width) ( ((char*)base) + (i)*width )

        这是一个C语言的宏定义,用于实现指针的数学运算。它的目的是简化指针的偏移量计算,提高代码的可读性和可维护性。这个宏定义的实现原理是,通过将指针与一个整数相加,实现指针的偏移量计算。其中,base 是原始指针,i 是偏移量,width 是指针宽度。

//插入排序
void insertionSort(void* base, int len,int width, int(*compare)(const void* e1, const void* e2)){
    if(base==NULL||compare == NULL||width<=0||len<=1)
        return;
    
    void *temp = malloc(width);
    memset(temp,0,width);
    
    for(int i = 1; i < len; i++){
        int j = i-1;

        memcpy(temp,PTR_MATH(base,i,width),width);

        for(; j >= 0&&(compare(PTR_MATH(base,j,width), PTR_MATH(base,i,width)) > 0); j--);
        
        memcpy(PTR_MATH(base,j+2,width),PTR_MATH(base,j+1,width),(i-j-1)*width);
        memcpy(PTR_MATH(base,j+1,width),temp,width);
                                                          
    }

    free(temp);
}

参数介绍

        函数insertionSort接受四个参数:base(指向数组的指针),len(数组长度),width(数组中每个元素的大小),以及compare(一个比较函数,用于比较两个元素的大小)。

总结

插入排序的时间复杂度为O(n^2)。

优点:

  1. 插入排序在实现上,通常采用in-place排序,不需要额外的存储空间。
  2. 插入排序的算法简单,容易理解。
  3. 插入排序适用于数据量较小或者部分已经排序的数组,对于大量数据的排序,插入排序的效率较低。

缺点:

  1. 插入排序的时间复杂度为O(n^2),在效率上不如其他高效的排序算法,如快速排序、归并排序等。
  2. 插入排序在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,对于已经排序好的元素,也需要进行移动,这在某些情况下可能会造成不必要的开销。

总结:插入排序是一种简单直观的排序算法,适用于数据量较小或者部分已经排序的数组,但对于大量数据的排序,插入排序的效率较低。在实际应用中,可以根据具体需求选择合适的排序算法。

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值