(此文为王道数据结构学习笔记,只供个人后续复习使用,若有错误,还望指出我改正,谢谢)
希尔排序:基于插入排序的优化
思路:让局部有序,减少移动消耗
设置一个增量d,把相距距离为d的元素记为同一个子表。例如d=10时,1,11,21...为一个子表,2,12,22...为一个子表,以此类推。然后对每个子表进行直接插入排序,使其有序。处理完毕后,将增量d缩小,重复上述过程,直到d=1。(若初始d=1,则变为直接插入排序)
常用d的取法:初始为N/2,每次减半,N为元素个数。
希尔排序代码实现:
void ShellSort(int A[],int n){
int d, i, j;
for(d=n/2;d>=1;d=d/2){ //增量变化
for(i=d+1;i<=n;++i){
if(A[i]<A[i-d]){
A[0]=A[i]; //A[0]暂存
for(i=i-d; j>0 && A[0]<A[j]; j=j-d){
A[j+d]=A[j];
}
A[j+d]=A[0]