1、算法基本思想
本质上还是插入排序,只是加入了gap这一变量,使得数组中的元素先分组预先排好序。
2、源代码
ShellSort
/*
* 函数名称:ShellSort
*
* 函数功能:希尔排序(普通)
*
* 入口参数:array, size
*
* 出口参数:void
*
* 返回类型:void
*/
void ShellSort(int array[], int size)
{
int i = 0;
int j = 0;
int g = 0;
int key = 0;
int gap = size;
while (gap > 1)
{
gap = gap / 3 + 1;
//间隔为gap,表示序列在哪一组
for (g = 0; g < gap; g++)
{
for (i = g + gap; i < size; i += gap)
{
key = array[i];
for (j = i - gap; j >= 0; j -= gap)
{
if (array[j] <= key)
{
break;
}
else
{
array[j + gap] = array[j];
}
}
array[j + gap] = key;
}
}
}
return;
}
main
#define _CRT_SECURE_NO_WARNINGS 1
/*
* Copyright (c) 2018, code farmer from sust
* All rights reserved.
*
* 文件名称:ShellSort.c
* 功能:希尔排序
*
* 当前版本:V1.0
* 作者:sustzc
* 完成日期:2018年7月8日12:26:23
*/
# include <stdio.h>
/*
* 函数名称:main
*
* 函数功能:测试主程序
*
* 入口参数:void
*
* 出口参数:0
*
* 返回类型:int
*/
int main(void)
{
int i = 0;
int numbers[] = {3, 1, 6, 4, 5, 2};
int len = sizeof(numbers) / sizeof(int);
printf("排序之前:\n");
for (i = 0; i < len; i++)
{
printf("%d ", numbers[i]);
}
ShellSort(numbers, len);
printf("\n排序之后:\n");
for (i = 0; i < len; i++)
{
printf("%d ", numbers[i]);
}
printf("\n");
return 0;
}
优化
齐头并进,不再是一组一组地比较,而是各组元素依次比较。
/*
* 函数名称:ShellSort
*
* 函数功能:希尔排序(优化)
*
* 入口参数:array, size
*
* 出口参数:void
*
* 返回类型:void
*/
void ShellSort(int array[], int size)
{
int i = 0;
int j = 0;
int g = 0;
int key = 0;
int gap = size;
while (gap > 1)
{
gap = gap / 3 + 1;
//齐头并进
for (i = gap; i < size; i++)
{
key = array[i];
for (j = i - gap; j >= 0; j -= gap)
{
if (array[j] <= key)
{
break;
}
else
{
array[j + gap] = array[j];
}
}
array[j + gap] = key;
}
}
return;
}
3、输出结果