介绍
插入排序(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)。
优点:
- 插入排序在实现上,通常采用in-place排序,不需要额外的存储空间。
- 插入排序的算法简单,容易理解。
- 插入排序适用于数据量较小或者部分已经排序的数组,对于大量数据的排序,插入排序的效率较低。
缺点:
- 插入排序的时间复杂度为O(n^2),在效率上不如其他高效的排序算法,如快速排序、归并排序等。
- 插入排序在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,对于已经排序好的元素,也需要进行移动,这在某些情况下可能会造成不必要的开销。
总结:插入排序是一种简单直观的排序算法,适用于数据量较小或者部分已经排序的数组,但对于大量数据的排序,插入排序的效率较低。在实际应用中,可以根据具体需求选择合适的排序算法。