您的位置:首页 > 其它

第十五周 项目1(3)-希尔排序

2016-12-15 11:28 197 查看
/*

*Copyright (c)2016,烟台大学计算机学院

*All rights reserved.

*文件名称:传写.cpp

*作者:李欣

*完成日期:2016年12月15日

*版本号:v1.0

*问题描述:用希尔排序算法,完成 {57,38,11,13,34,48,75,6,19,9,7}

*/

1、希尔排序

#include <stdio.h>

#define MaxSize 20

typedef int KeyType; //定义关键字类型

typedef char InfoType[10];

typedef struct //记录类型

{

KeyType key; //关键字项

InfoType data; //其他数据项,类型为InfoType

} RecType; //排序的记录类型定义

void ShellSort(RecType R[],int n) //希尔排序算法

{

int i,j,gap;

RecType tmp;

gap=n/2; //增量置初值

while (gap>0)

{

for (i=gap; i<n; i++) //对所有相隔gap位置的所有元素组进行排序

{

tmp=R[i];

j=i-gap;

while (j>=0 && tmp.key<R[j].key)//对相隔gap位置的元素组进行排序

{

R[j+gap]=R[j];

j=j-gap;

}

R[j+gap]=tmp;

j=j-gap;

}

gap=gap/2; //减小增量

}

}

int main()

{

int i,n=11;

RecType R[MaxSize];

KeyType a[]= {16,25,12,30,47,11,23,36,9,18,31};

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

R[i].key=a[i];

printf("排序前:");

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

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

printf("\n");

ShellSort(R,n);

printf("排序后:");

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

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

printf("\n");

return 0;

}

运行结果:



2、排序只输出每一趟的中间结果

#include <stdio.h>

#define MaxSize 20

typedef int KeyType; //定义关键字类型

typedef char InfoType[10];

typedef struct //记录类型

{

KeyType key; //关键字项

InfoType data; //其他数据项,类型为InfoType

} RecType; //排序的记录类型定义

void ShellSort(RecType R[],int n) //希尔排序算法

{

int i,j,gap,k;

RecType tmp;

gap=n/2; //增量置初值

while (gap>0)

{

for (i=gap; i<n; i++) //对所有相隔gap位置的所有元素组进行排序

{

tmp=R[i];

j=i-gap;

while (j>=0 && tmp.key<R[j].key)//对相隔gap位置的元素组进行排序

{

R[j+gap]=R[j];

j=j-gap;

}

R[j+gap]=tmp;

j=j-gap;

}

printf("gap=%d:",gap);

for (k=0; k<n; k++)

printf("%d ",R[k].key);

printf("\n");

gap=gap/2; //减小增量

}

}

int main()

{

int i,n=11;

RecType R[MaxSize];

KeyType a[]= {16,25,12,30,47,11,23,36,9,18,31};

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

R[i].key=a[i];

printf("排序前:");

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

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

printf("\n");

ShellSort(R,n);

printf("排序后:");

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

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

printf("\n");

return 0;

}

运行结果:



知识点总结:

1、 用R【j+gap】=R【j】实现组内移动。

2 、希尔排序的速度比直接插入速度快,但希尔排序不具有稳定性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: