0
点赞
收藏
分享

微信扫一扫

插入排序之希尔排序(缩小增量排序)


插入排序的特点是:
若基本有序,则时间复杂度低
若为逆序,则时间复杂度高
根据此特点,设计了希尔排序(又缩小增量排序)
让这个序列,逐步的变成一个有序的序列,对其进行插入排序,这样时间复杂度就会稍低
步长为几,就会分成几组
最后缩小为步长为1,即对所有的元素进行一次直接插入排序。
对每组内进行直接插入排序。
#####基本思想:先将排序表分割成d个形如L[i,i+d,i+2d,…,i+kd]的“特殊”字表,分别进行​直接插入排序​,当整个表中的元素已呈现“基本有序时”,再对全体记录进行一次直接插入排序。
比如第一次,选取的步长为3,那么就会分为3组,对每组进行直接插入排序,之后选取步长为2,对每组进行直接插入排序,最后选取步长为1,对每组进行直接插入排序。

对于每次取步长,希尔提出来的方法是d1=(n/2)取下界,d2=(d1/2)取下界

#####希尔排序,不稳定,只适用于顺序存储,因为对数组的编号进行操作
#####时间复杂度为O(n2),一般来说,比前两种要效率高,因为是O(n1.3)次方

第一个for循环是逐步缩小增量的过程,一直到增量为1

里面 的两个for循环就是对每一组进行一次直接插入排序
不是对每一组进行直接插入排序
其实是各个组同时进行直接插入排序
也就是电脑可以同时进行一些事情,而人可以一步一步来

第3个for 循环d

/*
*希尔排序
数组,长度
*/
void shell_sort(int *arr,int length)
{
int temp;
int j;
for(int d = (length/3) + 1;d >= 1;d =d/2)
{
for(int i = d;i < length; ++i)
{
temp=arr[i];
for(j = i-d; j >= 0 && temp < arr[j]; j = j-d)
{
arr[j+d]= arr[j];
}
arr[j+d] = temp;
}

}

}


举报

相关推荐

0 条评论