核心思想是,分组插入排序,减小组间元素的距离,当距离为1时排序完成;
写程序的要点还是循环控制
首先,距离变量gap,初始为4依次减半2,1.
对于gap=4的情况,就有四个分组(0,0+gap,...),(1,1+gap,...)(2,2+gap,...),(3,3+gap,...)即每个分组初始分别为0~gap-1
对于gap=2的情况
在每个分组的元素序列确定后,对每个分组进行插入排序
插入排序都这么繁琐,理清思路!
对于一组元素序列来说,首先设第一个元素是最小值,从下一个元素直到序列的最后一个元素(对于每个元素,一次和序列前的元素逐个对比,若大于某个序列元素k,则其最终的位置就是k+1,并且k+1及其之后的元素都右移一位)
这,循环控制还是要加强练习
插入排序的核心是,从当前元素的上一个元素开始直到序列的第一个元素结束,依次与当前元素进行对比,确定当前元素的最终位置
存在三种情况
(1)A[cur]>A[cur-1]
(2)A[cur]<A[0]
(3)在中间的某个位置上
也就是说,需要依次对比直到找到一个A[j]比A[cur]不大的元素,A[cur]放在它后面。。。如果到A[0]还未找到,则说明A[cur]应该放在A[0]的位置
int swapArray(float A[],int cur,int final,int gap)
{
if(cur==final+gap) return 0;
int i;
float temp = A[cur];
for(i=cur-gap;i>final;i-=gap)
A[i+gap]=A[i];
A[final+gap]=temp;
}
int shellSort(float A[],int n)
{
int gap;
for(gap=4;gap>=1;gap/=2)
{
int head;
for(head=0;head<gap;head++)
{
int i;
int j;
for(i=head+gap;i<n;i+=gap)
{
for(j=i-gap;j>=head;j-=gap)
if(A[i] > A[j]) break; //我晕,竟然在这里转不过弯了,玩彩票玩久了,好逸恶劳,理智都不清醒了
swapArray(A,i,j,gap);
}
}
}
}