插入類中的排序 數據量多的時候插入排序的優勢就越發的不明顯了 希爾對數據做了基本的排序 基本的哦 然後再用直接插入排一次 避免對已有序部分過分遍歷
引入了步長的概念 即對數據進行分組
---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;
}