八大排序算法之希尔排序

希尔排序是插入排序的进阶版本,他多次调用插入排序,在插入排序上进行了改造,使其处理无序的数据时候更快

核心思想:1.分组 2.直接插入排序:越有序越快

算法思想:

间隔式分组,利用直接插入排序让组内有序,然后缩小分组再次排序,直到组数为1,;理论基础为直接插入排序

高明之处:

我们正常分组时候是这样直接挨着分组,每3个3个分组,这样导致我们分组之后,小的数字变化不大,大的数字变化也不大,而我们希望小的数字在前面,大的数字在后面,这样可以减少我们的时间复杂度;

而我们通过这样的间隔式分组,可以实现,尽量让大数据在后面,肖书记在前面,通过5 3 1的三次分组,(注:最后一次必须是1的分组,因为我们要让所有数据有序)实现比插入排序时间复杂度低的排序

代码实现:

cpp 复制代码
//一趟希尔排序
static void Shell(int* arr, int len,int gap)//gap为组数或者(间隔)
{
	int tmp, i, j;
	for (i = gap; i < len; i+=gap)
	{
		tmp = arr[i];
		for (j = i - gap; j >= 0; j-=gap)
		{
			if (arr[j] > tmp)
			{
				arr[j + gap] = arr[j];
			}
			else
				break;
		}
		arr[j + gap] = tmp;
	}
}

void ShellSort(int* arr, int len)
{
	int drr[] = { 5,3,1 };
	for (int i = 0; i < sizeof(drr) / sizeof(drr[0]); i++)
	{
		Shell(arr, len, drr[i]);
	}
}

特点:

希尔排序时间复杂度O(n^1.3~n^1.5),空间复杂度O(1),不稳定

相关推荐
断剑zou天涯2 小时前
【算法笔记】窗口内最大值或最小值的更新结构
java·笔记·算法
smj2302_796826522 小时前
解决leetcode第3753题范围内总波动值II
python·算法·leetcode
骑着猪去兜风.4 小时前
线段树(二)
数据结构·算法
fengfuyao9855 小时前
竞争性自适应重加权算法(CARS)的MATLAB实现
算法
散峰而望5 小时前
C++数组(二)(算法竞赛)
开发语言·c++·算法·github
leoufung5 小时前
LeetCode 92 反转链表 II 全流程详解
算法·leetcode·链表
靠沿5 小时前
Java数据结构初阶——Collection、List的介绍与ArrayList
java·数据结构·list
wyhwust6 小时前
交换排序法&冒泡排序法& 选择排序法&插入排序的算法步骤
数据结构·算法·排序算法
利刃大大6 小时前
【动态规划:背包问题】完全平方数
c++·算法·动态规划·背包问题·完全背包
wyhwust6 小时前
数组----插入一个数到有序数列中
java·数据结构·算法