原理
將排序數組分成若干個子序列(這個取決於最初設定的步長值),然後對各個子序列之間進行直接插入排序,最後再縮小增量(即步長值)再進行插入排序,直到序列順序基本穩定(步長足夠小)時,對這種序列進行一次直接插入排序,在排序狀況較好時,直接插入排序的效率還是挺高的。
分析
在最壞的情況下,每個數字在每次比較的過程總都會被比較一次,所以在最壞的情況下其時間複雜度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])); } } } } }