排序算法——shell排序

原理

將排序數組分成若干個子序列(這個取決於最初設定的步長值),然後對各個子序列之間進行直接插入排序,最後再縮小增量(即步長值)再進行插入排序,直到序列順序基本穩定(步長足夠小)時,對這種序列進行一次直接插入排序,在排序狀況較好時,直接插入排序的效率還是挺高的。

分析

   在最壞的情況下,每個數字在每次比較的過程總都會被比較一次,所以在最壞的情況下其時間複雜度On2)。在最好的情況下,只比較一次,序列就基本有序,所以,其時間複雜度是On)。空間複雜度爲O1)。

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]));
                }
            }
        }
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章