【排序算法】----详解希尔排序算法

1.希尔排序

希尔排序实际上是一种插入排序的优化,希尔排序的目的是先进行预排序,使数组更加的有序,将需要排序的数组分成n/gap个大小为gap的子数组,对子树组进行插入排序。
当gap等于1时,就相当于直接插入排序了。
例如: 9 8 7 6 5 4 3 2 1 排升序
直接插入排序需要 45次
用希尔排序
在这里插入图片描述

2.代码展示

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>

void ShellSort(int* arr, int n)
{	
	int gap = n;
	while (gap > 1)
	{
		gap = gap / 3+1 ;	 //保证最后一次是1
		for (int i = 0; i < n - gap; ++i)
		{
			int end = i;
			int tmp = arr[end + gap];
			while (end >= 0)	//直到找到合适的位置,再插入
			{
				if (arr[end] > tmp)
				{
					arr[end + gap] = arr[end];
					end -= gap;
				}
				else
				{
					break;
				}
				arr[end + gap] = tmp;
			}

		}
	}
}

void Print(int* arr, int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

int main()
{
	int arr[] = { 9,1,12,3,5};
	int n = sizeof(arr) / sizeof(arr[0]);
	ShellSort(arr, n);
	Print(arr, n);
	system("pause");
	return 0;
}

3.结果展示

在这里插入图片描述

4.复杂度分析

时间复杂度: O(N1.3—N2
空间复杂度为: O(1)

5.心得体会

实现希尔排序的时候,通过查资料发现gap=3比较合理,但是我忘记一定要保证最后gap最小值为1,导致实现出现了问题。这个排序也比较简单,我们要理解分组的原因,而且这里处理非常的巧妙,不用分开用循环去遍历,因为数据是连接存储的,所以我们将数组放在一起,一次循环就完成了。

发布了79 篇原创文章 · 获赞 6 · 访问量 3772

猜你喜欢

转载自blog.csdn.net/qq_41152046/article/details/105143895