정렬 알고리즘 - 셸 정렬

의 원리
정렬 배열 을 여러 개의 키 서열 로 나 눈 다음 에 각 키 서열 간 에 정렬 을 직접 삽입 한 다음 에 증 가 량 (즉, 길이 값) 을 줄 이 고 정렬 을 삽입 합 니 다. 서열 순서 가 기본적으로 안정 (길이 가 충분 하 다) 될 때 까지 이런 서열 에 대해 직접 정렬 을 삽입 합 니 다. 정렬 상황 이 좋 을 때정렬 을 직접 삽입 하 는 효율 은 여전히 매우 높다.
분석 하 다.
   최 악의 경우 모든 숫자 는 매번 비교 하 는 과정 에서 한 번 씩 비교 되 기 때문에 최 악의 경우 시간 복잡 도 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 =0; j -= gap){
                if(arr[j] > arr[j + gap]){
                    swap(&arr[j], &arr[j + gap], sizeof(arr[j]));
                }
            }
        }
    }
}

좋은 웹페이지 즐겨찾기