【数据结构】希尔排序(ShellSort)

  • 概念:

希尔排序法,又称缩小增量法。希尔排序法的基本思想是:先选定一个整数, 把待排序文件中所有数据分成几个组,所有距离为gap的数据分在同一组内,并对每一组内的数据进行排序。 然后,去重复上述分组和排序的工作。当到达gap=1时,所有数据在一组内排好序。

  • 算法思想:

将待排序数组按照步长gap进行分组,然后对每组的元素利用直接插入排序的方法进行排序;每次将gap折半减小,循环上述操作;当gap=1时,利用直接插入,完成排序。

         

  • 具体代码:
#include <stdio.h>
#include <stdlib.h>

void ShellSort(int* a, int n)//希尔排序
{
	int gap = n;
	while (gap > 1)
	{
		gap = gap / 3 + 1;
		for (int i = 0; i < n - gap; i++)
		{
			int end = i;
			int tmp = a[end + gap];
			while (end >= 0 && a[end]>tmp)
			{
				a[end + gap] = a[end];
				end -= gap;
			}
			a[end + gap] = tmp;
		}
	}
}

void SortTest()
{
	int a[10] = { 5, 2, 4, 6, 1, 3, 8, 7, 9,0 };
	int sz = sizeof(a) / sizeof(a[0]);
	printf("希尔排序:>");
	ShellSort(a, sz);
	PrintArray(a, sz);
}
int main()
{
	SortTest();
	system("pause");
	return 0;
}
  • 特性总结:

      1.希尔排序是对直接插入排序的优化;

      2.当gap> 1时都是预排序,目的是让数组更接近于有序。当gap== 1时,数组已经接近有序的了,这样就

      会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比;

      3.希尔排序的时间复杂度不好计算,需要进行推导,推导出来平均时间复杂度: O(N^1.3- -N^2)

     4.稳定性:不稳定

     5.敏感性:对数据很敏感,如果数组已经接近有序,排序效率很高

猜你喜欢

转载自blog.csdn.net/qq_42270373/article/details/83818586