插入类中的排序 数据量多的时候插入排序的优势就越发的不明显了 希尔对数据做了基本的排序 基本的哦 然后再用直接插入排一次 避免对已有序部分过分遍历
引入了步长的概念 即对数据进行分组
---C语言实现
#include <stdio.h>
#include <stdlib.h>
//希尔排序
void ShellSort(int arr[],int length)
{
int step;
int count;
int count_in;
int Temp;
int UnSortedHead;//未排序头
int SortedTail;//已排序尾
if(arr == NULL || length <=0)return ;
step = length/2;//步长
while(step)
{
for(count = 0;count<step;count++)
{
SortedTail = count;
UnSortedHead = count+step;
while(UnSortedHead <length)
{
if(arr[UnSortedHead] < arr[SortedTail])
{
count_in = SortedTail;
Temp = arr[UnSortedHead];
while(count_in>=0)
{
if(Temp < arr[count_in])
{
arr[count_in+step] = arr[count_in];
count_in-=step;
}
else
break;
arr[count_in+step] = Temp;
}
}
SortedTail+=step;
UnSortedHead+=step;
}
}
step/=2;
}
}
//遍历数组
void LoopForArr(int arr[],int length)
{
int count;
if(arr == NULL || length <=0)return ;
for(count = 0;count<length;count++)
{
printf("%d ",arr[count]);
}
printf("\n");
}
int main()
{
int arr[] = {22,34,1,6,9,123,55,78,12,4,56,87,52};
ShellSort(arr,sizeof(arr)/sizeof(arr[0]));
LoopForArr(arr,sizeof(arr)/sizeof(arr[0]));
system("pause");
return 0;
}