前置知识
本期内容
名词解释
- shell sort又叫 缩小增量排序,1959年由 D.L.Shell提出来的。
- 基本思路
- 先取d1作为一个增量,分为d1个组,然后各组内进行排序
- 再取d2作为下一个增量,重复上面的分组与排序,直到di=1。
- 选取增量序列的基本原则 最后一个增量必须是1,推荐为d1=n/2,di=d(i+1)/2。
实现
- 时间复杂度
- 关键字值的比较次数与记录移动次数依赖于 步长因子序列的选取。一般是在O(n*n)和O(nlog$2n)之间。
- 不稳定的排序算法
void ShellSortASC(int s[], int n)//升序
{
int i,j,d;
d = n/2; // 确定固定增量值
while(d >= 1)
{
for(i=d+1;i<=n;i++)
{
s[0]=s[i];//监视哨
j = i-d; // 确定要进行比较的元素的最右边的位置
while((j>0)&&(s[0]<s[j]))
{
s[j+d]=s[j]; // 数据右移
j=j-d; // 再向左移d个位置
}
s[j+d]=s[0]; // 在确定的位置插入s[i]
}
d = d/2; // 增量为原来的一半
}
}
void ShellSortDES(int k[], int n)
{
int i,j,flag,gap=n;
int temp;
while(gap>1)
{
gap = gap/2; // 增量缩小,每次减半
do{
flag = 0;
for(i=1;i<n-gap;i++)
{
j=i+gap;
if(k[i]<k[j])
{
temp=k[i];
k[i]=k[j];
k[j]=temp;
flag = 1;
}
}
}
while(flag!=0)
}
}
总体评价
代码学习
履历
- 20180320初步实现了代码,记住了结论,理解了过程,但还需要深入理解每行代码意思,主题阅读一下。