码迷,mamicode.com
首页 > 编程语言 > 详细

排序算法——shell排序

时间:2016-03-16 01:26:46      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:希尔排序   排序算法   c语言实现   复杂度   

原理

将排序数组分成若干个子序列(这个取决于最初设定的步长值),然后对各个子序列之间进行直接插入排序,最后再缩小增量(即步长值)再进行插入排序,直到序列顺序基本稳定(步长足够小)时,对这种序列进行一次直接插入排序,在排序状况较好时,直接插入排序的效率还是挺高的。

分析

   在最坏的情况下,每个数字在每次比较的过程总都会被比较一次,所以在最坏的情况下其时间复杂度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]));
                }
            }
        }
    }
}


本文出自 “11219885” 博客,请务必保留此出处http://11229885.blog.51cto.com/11219885/1751535

排序算法——shell排序

标签:希尔排序   排序算法   c语言实现   复杂度   

原文地址:http://11229885.blog.51cto.com/11219885/1751535

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!