前言
我们学过较多的排序,排序分为:插入排序,选择排序,交换排序,归并排序这几种,这些排序在时间复杂度和空间复杂度上存在着一些差异,下面我们会对插入排序进行详细的讲解。
插入排序
直接插⼊排序是⼀种简单的插⼊排序法,其基本思想是:把待排序的记录按其关键码值的⼤⼩逐个插 ⼊到⼀个已经排好序的有序序列中,直到所有的记录插入完为止,得到⼀个新的有序序列。
插入排序的时间复杂度
时间复杂度为 O():在最差情况下,每次插入操作分别需要循环 n − 1、n − 2、…、 2、1 次,求和得到 (n − 1)n/2 ,因此时间复杂度为 O() 。在遇到有序数据时,插入操作会提前终 止。当输入数组完全有序时,插入排序达到最佳时间复杂度 O(n)。
插入排序的优点
插入排序的时间复杂度为O() ,而我们即将学习的快速排序的时间复杂度为 O(n log n) 。尽管插入排序 的时间复杂度更高,但在数据量较小的情况下,插入排序通常更快。
源代码
//插入排序
void InsertSort(int* arr, int n)
{
for (int i = 1; i < n; i++)
{
int j = i - 1;
int base = arr[i];
//升序的写法
while(j >= 0 && arr[j] > base)
{
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = base;
}
}
希尔排序
希尔排序法⼜称缩⼩增量法。希尔排序法的基本思想是:先选定⼀个整数(通常是gap =n/3+1),把 待排序⽂件所有记录分成各组,所有的距离相等的记录分在同⼀组内,并对每⼀组内的记录进行排 序,然后gap=gap/3+1得到下⼀个整数,再将数组分成各组,进⾏插⼊排序,当gap较大的时候这时是预排序,当gap=1时,就相当于 直接插⼊排序。 它是在直接插⼊排序算法的基础上进⾏改进⽽来的,综合来说它的效率肯定是要高于直接插⼊排序算 法的。
注意:下图是网上寻找的动态示意图只是为了直观展示希尔排序,一般不采用n/2+1的情况因为这种情况分组太多。
希尔排序的时间复杂度
时间复杂度大约为O()
下面图片是数据结构(C语⾔版)》---严蔚敏书中给出的时间复杂度的讲解。
希尔排序的优点
-
时间复杂度较低:尽管最坏情况下的时间复杂度是 O(n2)O(n2)(类似于插入排序),但在平均情况下,希尔排序的时间复杂度通常在 O(n1.5)O(n1.5) 到 O(nlog2n)O(nlog2n) 之间,根据所使用的增量序列而有所不同。
-
减少数据移动:希尔排序通过先对元素进行间隔较大的位置的排序,逐渐将元素移到最终的位置,减少了数据移动的次数。
-
适用于大规模数据:由于希尔排序在处理大规模数据时相比普通的插入排序有明显的速度优势,它尤其适用于部分有序的数据。
源代码
void ShellSort(int* arr, int n)
{
int gap = n;
while (gap>1)
{
gap = gap/ 3 + 1;
for (int j = 0; j < n - gap; j++)
{
int base = arr[j + gap];
while (j >= 0 && arr[j] > base)
{
arr[j + gap] = arr[j];
j -= gap;
}
arr[j + gap] = base;
}
}
}
总结
插入排序和希尔排序在时间复杂度和便利性方面都有一定的差异。插入排序适用于小规模数据或者已经基本有序的数据,而希尔排序适用于中等规模数据,尤其是部分有序的数据。在实际应用中,可以根据具体的需求和数据特点选择合适的排序算法。以上就是本期的总结,期待各位大佬的一键三连(点赞,收藏,关注)。