原理
将排序数组分成若干个子序列(这个取决于最初设定的步长值),然后对各个子序列之间进行直接插入排序,最后再缩小增量(即步长值)再进行插入排序,直到序列顺序基本稳定(步长足够小)时,对这种序列进行一次直接插入排序,在排序状况较好时,直接插入排序的效率还是挺高的。
分析
在最坏的情况下,每个数字在每次比较的过程总都会被比较一次,所以在最坏的情况下其时间复杂度O(n2)。在最好的情况下,只比较一次,序列就基本有序,所以,其时间复杂度是O(n)。空间复杂度为O(1)。
C语言实现
void swap(void *a, void *b, int size) { void *tmp = Malloc(size); memcpy(tmp, a, size); memcpy(a, b, size); memcpy(b, tmp, size); free(tmp); } void shell_sort(int *arr, int arrlen) { int i = 0, j = 0; int gap = 0; if(NULL == arr || 0 >= arrlen){ return ; } for(gap = arrlen/2; gap>0; gap /= 2){ for(i = gap; i < arrlen; ++i){ for(j = i - gap; j >=0; j -= gap){ if(arr[j] > arr[j + gap]){ swap(&arr[j], &arr[j + gap], sizeof(arr[j])); } } } } }
本文出自 “11219885” 博客,请务必保留此出处http://11229885.blog.51cto.com/11219885/1751536
原文地址:http://11229885.blog.51cto.com/11219885/1751536