希尔排序是什么

简介: 希尔排序:外套一层间隔逐步缩小的循环的插入排序

首先我们来看插入排序的code demo:

include

void insertSort(int arr[],int len)
{
for(int i=1;i=0&&arr[j]>get)
{
arr[j+1]=arr[j];
j-=1;
}
arr[j+1] = get;
}
}

void printArray(int arr[],int len)
{
for(int i=0;i<len;i++)
printf("%2d ",arr[i]);
printf("\n");
}

main()
{
int arr[] = {3,14,2,11,6,13,9,10,7,4,5,8,1,12};
int len = sizeof arr / sizeof *arr;
printArray(arr,len);
insertSort(arr,len);
printArray(arr,len);

getchar();

}
外套一层间隔逐步缩小的循环,将插入排序中间隔是1的部分改为间隔变量,就变成了希尔排序:

void shellSort(int arr[],int len)
{
for(int gap = len/2;gap>0;gap/=2)
for(int i=gap;i=0&&arr[j]>get)
{
arr[j+gap]=arr[j];
j-=gap;
}
arr[j+gap] = get;
}
}
gap也可以处理为 ……,gap*3+1,……,40,13,4,1的序列:

void shellSort(int arr[],int len)
{
int gap = 0;
while(gap<=len)
gap = gap*3+1;
for(;gap>0;gap=(gap-1)/3)
for(int i=gap;i=0&&arr[j]>get)
{
arr[j+gap]=arr[j];
j-=gap;
}
arr[j+gap] = get;
}
}
插入排序内部也可以写成逐个做插入的形式(冒泡形式):

void insertSort(int arr[],int len)
{//代码效果参考:http://www.zidongmutanji.com/bxxx/465442.html

for(int i=1;i<len;i++)
{
    for(int j=i;j>0 && arr[j]>arr[j-1];j--)
    {
        int tmp = arr[j];
        arr[j] = arr[j-1];
        arr[j-1] = tmp;
    }
}

}
void insertSort(int arr[],int len)
{
for(int gap = len/2;gap>0;gap/=2)
for(int i=gap;i=gap && arr[j]<arr[j-gap];j-=gap)
{
int tmp = arr[j];
arr[j] = arr[j-gap];
arr[j-gap] = tmp;
}
}

相关文章
|
3月前
|
搜索推荐
希尔排序
希尔排序。
31 6
|
9月前
|
搜索推荐 Shell C++
C++希尔排序的实现
C++希尔排序的实现
|
9月前
|
存储 搜索推荐 算法
插入排序(一)——直接插入排序与希尔排序
插入排序(一)——直接插入排序与希尔排序
60 1
|
9月前
|
搜索推荐
直接插入排序和希尔排序
直接插入排序和希尔排序
83 0
|
算法 搜索推荐 Shell
18 希尔排序
18 希尔排序
42 0
插入排序与希尔排序
插入排序与希尔排序
63 0
|
搜索推荐 测试技术 C++
【插入排序】直接插入排序 与 希尔排序
【插入排序】直接插入排序 与 希尔排序
|
搜索推荐 算法 C#
C#——希尔排序
C#——希尔排序
109 0