希尔排序的基本思想是:首先将整个待排序序列划分为若干个子序列,分别进行直接插入排序。 当整个待排序序列基本有序时,则对所有记录进行直接插入排序。 希尔排序也称为收缩增量排序,由于1959年提出。
希尔排序的具体实现方法和步骤:
A。 选择步骤序列 d1, d2, d3,..., dk,其中 di > dj, dk = 1;
b. 根据步骤序列数K对序列进行K次排序
C。 每次排序操作按照对应的步长di进行分组,即将待排序的记录序列中距离为di的所有记录放在同一组中。 这样就可以将待排序的序列分成若干个长度为m的子序列,对每组分别进行直接插入排序。 当dk=1时,整个序列被当作一个表来处理,表的长度就是整个序列的长度,整个排序就完成了。
具体希尔排序函数实现如下(按照逐渐递增排序):
/* 希尔排序算法的简单实现
* array[]: 待排序的数组
*:待排序数组的长度
* d[]:增量值数组
*:增量值的个数
*/
void (int array[], int, int d[], int)
整数 i、j、k、m;
整数跨度; // 用于存储具体的增量值
国际温度; // 用于存储要排序的元素的临时值
for(m = 0; m < ; m++)
跨度=d[m]; // 获取增量值
for(k = 0; k < 跨度; k++)
for(i = k; i < -1; i += 跨度)
临时=数组[i+1];
j = 我;
while((j > -1) && (temp < 数组[j]))
数组[j + 1] = 数组[j];
j——;
数组[j + 1] = 临时;
测试功能的实现如下:
/* 程序的入口函数*/
int main()
整数a[];
整数我;
int d[3] = {5, 3, 1}; //定义一个表示增量值的数组
/* 输入10个塑料元素*/
("输入%d:",);
for(i = 0; i < ; i++)
scanf("%d", &a[i]);
(“**************************************************** **************”);
/* 打印出排序前的所有元素*/
(“排序是:”);
for(i = 0; i< ; i++)
(“%d”,a[i]);
(“”);
(“**************************************************** **************”);
/* 直接插入元素从小到大排序 */
(a, , d, (d)/(d[0]));
/* 打印出所有已排序的元素*/
(“排序后是:”);
for(i = 0; i < ; i++)
(“%d”,a[i]);
(“”);
0;
【希尔排序(C语言实现)】相关文章:
希尔排序算法的C语言实现实例10-04
冒泡排序(C语言实现)10-04
简单选择排序(C语言实现)10-04
C语言实现归并排序算法示例11-21
排序一:直接插入排序(C语言实现)12-03
直接插入排序(C语言实现)10-06
C语言排序算法10-05
6种常见排序算法的C语言实现10-04
C语言冒泡排序算法示例11-21