您的位置:首页 > 其它

希尔排序(缩小增量排序)

2012-03-11 11:20 190 查看
算法思想:先将整个待排记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序“时,在对全体记录进行一次直接插入排序。子序列有像个某个增量的记录组成,而增量逐渐缩小为1, 增量系列计算可参考 d(n) = d(n)/3 + 1

#include <stdlib.h>

#include <stdio.h>

#include <time.h>

#define MAX 256

int R[MAX];

int t; /* d记录数据移动大概次数 */

void shellsort(int dx, int n)

{

int i, j;

for(i=dx+1; i<=n; ++i) /* R[0]保留,所以从R[1]开始排序 */

{

j = i-dx;

if( R[i] < R[j] )

{

R[0] = R[i]; /* 用R[0]暂存R[i] */

for(; j>0 && R[0]<R[j]; j-=dx) /*对增量为dx的序列进行插入排序*/

{

R[j+dx]=R[j];

++t;

}

R[j+dx] = R[0];

}

}

}

void ShellSort(int n)

{

int dx;

printf("\n\n增量有: ");

for(dx=n/3+1; dx>0; dx=dx/3+1)

{

shellsort(dx, n);

printf("%d ", dx); /* 输出该组排序数据的增量序列 */

if(1==dx) /* 最后一次插入排序后退出,避免死循环 */

return;

}

}

int main()

{

int n, i;

printf("How many numbers do you want to sort: ");

scanf("%d", &n);

if( n<1 || n>MAX )

{

printf("Wrong input!!");

return 0;

}

srand(time(0));

for(i=1; i<=n; i++)

{ /* 产生100以内的随机数序列作为测试数据 */

R[i] = rand()%100;

}

printf("\nBefore sort:\n");

for(i=1; i<=n; ++i)

{

printf("%d ", R[i]);

}

ShellSort(n);

printf("\n\nAfter sort:\n");

for(i=1; i<=n; ++i)

{

printf("%d ", R[i]);

}

printf("\n\nMove times: %d\n", t);

system("pause");

return 0;

}

测试结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: