希尔排序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);
算法不稳定.
*/