【C】排序算法之希尔排序

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、输出结果


猜你喜欢

转载自blog.csdn.net/sustzc/article/details/81055729