插入类中的排序 数据量多的时候插入排序的优势就越发的不明显了 希尔对数据做了基本的排序 基本的哦 然后再用直接插入排一次 避免对已有序部分过分遍历
引入了步长的概念 即对数据进行分组
---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; }