希尔排序
应用场景
元素多的时候还想用插入排序
核心思想
高级插入排序
分组思想 非连续有间隔的分组
- 间隔分组
- 插入排序
- 在间隔分组分组,直至间隔为0分为一组
间隔按一定规律变换
步骤:1. 定间隔 for(nGap = nlength/2;nGap>0;nGap/=2)
2. 间隔分组 for(i = 0 ; i < nGap ; i ++)
3. 个组插入排序
for(j = i + nGap ; j < nlength ; j +=nGap)
代码
#include<stdio.h>
void ShellSort(int arr[],int nlength)
{
//定间隔
int nGratplength = nlength/2; //间隔变量
int i; // 组变量
// 插入排序用三个变量
int k;
int j;
int Temp;
while(nGratplength >= 1)
{
//间隔分组 分为nGratplength组
for(i = 0;i < nGratplength ; i ++)
{
//组内插入排序
// k = i + nGratplength; // 无序第一个
for(k = i + nGratplength ; k < nlength ; k = k +nGratplength)
{
j = k - nGratplength; // 有序最后一个
Temp = arr[k]; // 记录无序第一个的值
while(arr[j] > Temp && j >= i)
{
arr[j + nGratplength] = arr[j];
j = j -nGratplength;
}
//插入
arr[j+nGratplength] = Temp;
}
}
nGratplength = nGratplength/2;
}
}