希尔排序
Shell排序算法:一种更高效的插入排序。
基本原理:先比较距离远的元素,而不是简单交换排序算法那样比较相邻的元素,这样可以快速减少大量的无序情况,从而减轻后续的工作。被比较的元素之间距离逐渐减少,直到为1时变成相邻元素的互换。
参考:https://www.cnblogs.com/lustar/p/7396048.html
https://blog.youkuaiyun.com/m0_37190495/article/details/80655139
https://www.cnblogs.com/youzhibing/p/4889037.html
三篇博客更容易理解。
我这篇博客,主要是为了以后方便回顾,内容以后再整理。
代码
/* 因为gap最后总会变成1,故最后一次排序将是数组的所有元素进行一次插入排序,此时数组基本有序,插入排序效率会很高! */
void shellsort(int v[],int n){
int gap, i , j, temp;
for(gap = n/2 ; gap > 0; gap /=2 ){ /* gap:增量,即控制元素之间的距离。将距离为gap的元素分为一组 */
for(i = gap; i < n; i++){ /* 前gap个元素,每个都是对应分组内的第一个元素,对插入排序来说,只有一个元素时本身就是有序的,故所有组的第一个元素不用排序 */
for(j = i - gap; j >= 0 && v[j]>v[j+gap]; j-=gap){/* 相当于将距离为gap的元素提取出来组成一个短的无序数组,再对其进行插入排序 */
/* 最重要的是这个循环,这层循环不是相邻元素挨个比较,而是每隔gap距离的元素组成的更短的数组进行排序 */
temp = v[j];
v[j] = v[j+gap];
v[j+gap] = temp;
}
}
}
}
Shell排序基本插入排序,可以参考我的博客:https://blog.youkuaiyun.com/qq_28193019/article/details/88297404
对照里面的代码结构,可以发现,shell排序主要就是采用了“增量下降”法,多了个增量控制:gap,其他的跟基本的插入排序一模一样,所以对插入排序了解有助于理解shell排序。