希尔排序C/C++

void ShellSort(int a[],int left,int right);

//对a[left]到a[right]从小到大排序
void ShellSort(int a[],int left,int right)
{
    int len = right - left +1;
    int gap,i,j,temp;
    //Shell提出的增量选取规则n/2,n/4,...,2,1
    for(gap=len/2;gap>0;gap/=2)
        for(i=left+gap;i<=right;i++)
            for(j=i-gap;j>=left && a[j]>a[j+gap];j-=gap){  //a[j]和a[j+gap]为一个子序列
                temp = a[j];            /*当j-=gap后的子序列a[j],a[j+gap]已经处理则*/
                a[j] = a[j+gap];        /*j-=gap仅是为了让其退出本次循环,进而选取下一个子列*/
                a[j+gap] = temp;
            }           
}

/*算法分析:
    time-complexity: 与增量的选取有关,shell选取增量规则时间复杂度为O(n2),
                     帕佩尔诺夫(Papernov)和斯塔舍维奇(Stasevich)提出的 2的k次方+1,...,65,33,17,9,5,3,1
                     其中k为大于等于1的整数,2的k次方+1小于待排序列的长度,此时时间复杂度为O(n1.5次方)    
    space-complexity: O(1);
    算法不稳定.
*/

 

posted @ 2018-04-17 21:25  蝉鸣的Summer  阅读(182)  评论(0编辑  收藏  举报