希尔排序(缩小增量排序)
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;
}
测试结果:
#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;
}
测试结果:
![](http://hi.csdn.net/attachment/201203/11/0_13314361297Rw0.gif)
相关文章推荐
- 一天一排序之“希尔排序(缩小增量排序)”
- 八大排序算法 之 希尔排序(缩小增量排序)
- 排序算法(八)希尔排序(缩小增量排序)
- 排序 - 希尔排序(缩小增量排序)
- 排序-插入排序-希尔排序(缩小增量排序)-数据结构(28)
- 排序 - 希尔排序(缩小增量排序)
- 插入排序、折半插入排序、希尔排序(缩小增量排序)
- 希尔排序 缩小增量排序
- Java 希尔排序(缩小增量排序)
- 排序算法的C++ && Python实现---希尔排序(缩小增量排序)
- 数据结构之插入排序之希尔排序(缩小增量排序)—参考整理严蔚敏数据结构
- 希尔排序(缩小增量排序)
- 算法【4】:希尔排序(缩小增量排序)
- 希尔排序(缩小增量排序)
- ReviewForJob——希尔排序(缩小增量排序)之塞奇威克增量序列
- 希尔排序(shellsort)又叫增量递减排序(diminishing increment)
- Java排序--》希尔排序(增量排序)
- 数据结构63:希尔排序算法(缩小增量排序)
- 插入排序) 希尔排序 (最小增量排序)
- 排序算法(二):希尔排序(最小增量排序)