首页 > 编程语言 > 详细

排序算法——shell排序

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

原理

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

分析

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

排序算法——shell排序

原文:http://11229885.blog.51cto.com/11219885/1751536

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!