1.5插入排序-希尔排序
/*Shell sort 本质为 Ddiminishing Increment Sort*/
一.评估
不稳定的排序算法
时间复杂度O(n^1.5)
二.思想
缩小增量分组插入排序。
基本有序时,效率高
r[0]作用:暂存器。
void Shell_InsertSort(int *r)
{
int k,dk,i,j;
for( k = 0; k < 3; k ++)//缩小增量
{
dk = dlta[k];//3、2、1
for( i = dk+1; i <= N; i ++)
{
if(r[i] < r[i-dk])//待插
{
r[0] = r[i];//r[0]暂存器
for( j = i-dk; j>0 && r[0]<r[j]; j-=dk)
{
r[j+dk] = r[j];
}
r[j+dk] = r[0];
}
}
}
}
三.示例
/*Shell sort 本质为 Ddiminishing Increment Sort*/
# include <stdio.h>
void creat(int *r);
void Shell_InsertSort(int *r);
void print(int *r);
int N;
int dlta[3] = {3,2,1};
int main()
{
int a[50];
printf("/*default increment is 3,2,1,you can change it in global variable*/\n");
creat(a);
Shell_InsertSort(a);
print(a);
}
void creat(int *r)
{
int i;
printf("sort how many numbers :");
scanf("%d",&N);
printf("input %d numbers :",N);
for(i = 1;i <= N;i ++)
{
scanf("%d",&r[i]);
}
}
void Shell_InsertSort(int *r)
{
int k,dk,i,j;
for( k = 0; k < 3; k ++)//缩小增量
{
dk = dlta[k];//3、2、1
for( i = dk+1; i <= N; i ++)
{
if(r[i] < r[i-dk])//待插
{
r[0] = r[i];//r[0]暂存器
for( j = i-dk; j>0 && r[0]<r[j]; j-=dk)
{
r[j+dk] = r[j];
}
r[j+dk] = r[0];
}
}
}
}
void print(int *r)
{
int i;
printf("the result is :");
for(i = 1;i <= N;i ++)
printf("%d ",r[i]);
printf("\n");
}
四.说明
由于数学尚未解决,还未提出效率最高的递增序列。
递增序列最后为1,且没有处1以外的公约数。