希尔排序
排序通过比较相距一定间隔的元素进行工作,各趟比较的间隔随着算法的进行而减小,直到只比较相邻元素的最后一趟为止。由此,希尔排序也被称为缩小增量排序。
算法分析
在进行间隔为h的一趟排序后,对于每一个i,保证A[i]<=A[i+h],所有间隔为h的元素均进行了排序。(称此时文件为h-排序的)
h随着算法的进行一直减小,直到为1,即执行相邻元素的排序。(一趟h-排序就是对h个独立的子数组执行一次插入排序。)
实例分析
如图
最初按5-排序:
从A[5]开始判断,若A[5]>A[0],交换位置;
接着判断A[6]与A[1]的大小,同上;
直到判断到最后一个元素。
之后按2-排序:
从A[2]与A[0]开始判断;
接着A[3]与A[1];
…
直到判断到最后一个元素。
最后按1-排序:
即A[1]与A[0]开始判断;
接着A[2]与A[1];
…
直到判断到最后一个元素
结束
代码:
void xr(int a[],int n){
int i,j,x,s;
for(x=n/2;x>0;x/=2){ //确定间隔,每次缩小直至到1
for(i=x;i<n;i++){ //从A[i]开始判断,直到A[n-1]
s=a[i]; //把A[i]读入
for(j=i;j>=x;j-=x){ //进行一次判断
if(s<a[j-x]) //如果之前的数更大
a[j]=a[j-x]; //则A[i-x]后移到A[i]的位置
else break;
}
a[j]=s; //如果执行操作,则将A[i]插入A[i-x]的位置
} //若未执行操作,则把A[i]放回
}
}