在没有学习希尔排序之前,想必老铁们应该只接触过冒泡排序。冒泡排序想必各位老铁已经能完全吃透了,可以手撕冒泡了。但是,手撕冒泡似乎不是什么难事,很多小白也掌握了冒泡排序,所一手撕冒泡似乎没有太大的意义。冒泡排序呢实际上没有什么意义,唯一的意义就是教学意义,因为它比其他排序都容易理解,算是入门水准,它的效率上桌吃饭只能和狗坐一桌。实践当中狗都不用,当然这里没有骂人的意思啊哈哈,接下来我们就开始讲解希尔排序。
正文开始:
一、插入排序
在讲希尔排序之前,我们要先讲讲插入排序。为什么要先讲插入排序呢?这里我先卖个关子。
我们先来看看插入排序的动图:
看了这个动图的老铁应该已经知道什么叫插入排序了吧?还没看懂的老铁听我细细道来。插入排序就是假设前n个数是有序的,然后将第n+1个数依次与前面n个数比较,假设在其中比n要小但比n-1大,那么就将n往后挪动一位,将要插入的数字插入空位即可。
代码展示:
//实现插入排序
void InsertSort(int* a, int n)
{
//[0,end]有序 [end+1]的值插入
//单趟排序
for (int i = 0; i < n-1 ; i++)
{
int end=i;
int temp = a[end + 1];//先将end+1的数据保存起来,将比它大的值往后挪之后就可以将其插入空位了
//单趟排序
while (end >= 0)
{
if (a[end] > temp)
{
//使用Swap(&a[end], &a[end + 1]);就是交换而不是插入了
a[end + 1] = a[end];
end--;
}