本文针对希尔插入排序。
时间复杂度是随增量序列改变而改变的,希尔序列却没有最好的选择。因此时间复杂度没有确定。
思想是做几次增量不为1的插入排序,使得序列基本有序,最后再做一次增量为1的插入排序。
增量序列选取的时候有一定原则,最后一个元素必须是1,而且所有的值没有公因子。下边给出大神们推荐的3个增量序列
程序:
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 50
#define N 15
#define P 4
typedef struct{
int key;
int other;
}node;
typedef struct
{
node array[MAXSIZE + 1];
int length;
}list;
//做一次希尔排序
void ShellInsert(list *l,int dk)
{
int i,j;
for(i = dk + 1;i <= l->length;++i)
if(l->array[i].key < l->array[i-dk].key){
l->array[0] = l->array[i];
for(j = i - dk;j > 0 && l->array[0].key < l->array[j].key;j -= dk)
l->array[j + dk] = l->array[j];
l->array[j + dk] = l->array[0];
}
}
//希尔排序
void ShellSort(list *l,int dlta[],int n)
{
int i;
for(i = 0;i < n;++i)
ShellInsert(l,dlta[i]);
}
void print(list *l)
{
int i;
for(i = 1;i <= l->length;i++)
printf("%d %d\t",l->array[i].key,l->array[i].other);
printf("\n");
}
void main()
{
node data[N]={{5,6},{13,5},{22,2},{2,4},{6,5},{99,7},{6,15},{1,22},{15,12},{58,12},{48,40},{26,48},{38,35},{72,58},{61,22}};
list l;
int i,dt[P]={5,3,2,1}; //增量序列数组
for(i = 0;i < N;i++)
l.array[i + 1] = data[i];
l.length = N;
printf("befor sort:\n");
print(&l);
ShellSort(&l,dt,P);
printf("after shell sort:\n");
print(&l);
}
结果:
[09:57:38]# ./c
befor sort:
5 6 13 5 22 2 2 4 6 5 99 7 6 15 1 22 15 12 58 12 48 40 26 48 38 35 72 58 61 22
after shell sort:
1 22 2 4 5 6 6 15 6 5 13 5 15 12 22 2 26 48 38 35 48 40 58 12 61 22 72 58 99 7