希尔排序及其时间复杂度(图文详解)

这篇具有很好参考价值的文章主要介绍了希尔排序及其时间复杂度(图文详解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

😾 博客主页: 爱吃bug的猿
🚀博客专栏: 数据结构,C语言初阶进阶全流程讲解
😽😽😽如果喜欢博主的文章,可以给博主点波赞和关注加速博主更新

前言

  • 希尔排序里的一部分和插入排序极其相似,了解插入排序及其复杂度(动图讲解)可点击此处
  • 希尔排序分为两部分:预排序+插入排序

1. 代码思路

  1. 选定一个整数作为增量gap,假设gap为3,则间隔为3的元素为一组,总计gap组
    希尔排序及其时间复杂度(图文详解),数据结构,排序算法,算法,数据结构
  2. 接着对第一组(黑色)进行插入排序,第一组排完排第二组(蓝色),最后排第三组(黑色)
  3. gap == 3 排序结果如下
    希尔排序及其时间复杂度(图文详解),数据结构,排序算法,算法,数据结构
  4. gap要减小(因为gap最终要减小为1,即增量为1的插入排序,经过这次排序后,才能保证数组真正有序),重复1,2步骤(gap > 1 是预排序,目的是让数组接近有序,gap == 1 排序后即有序),假设gap减小为2

希尔排序及其时间复杂度(图文详解),数据结构,排序算法,算法,数据结构
4. gap==2排序结果为
希尔排序及其时间复杂度(图文详解),数据结构,排序算法,算法,数据结构
5. 最后gap == 1,插入排序即可
6. 目前gap的取法很多gap = gap/3 + 1(这里+1,是为了保证gap的最后的结果可以是1),gap = gap/2

代码实现法1

void ShellSort(int*a,int n)
{
	int gap = n;
	while (gap > 1)
	{
		gap = gap / 3 + 1;
		//间隔为gap的元素分为一组,总计gap组,gap每次减小,直至gap == 1
		for (int j = 0; j < gap; j++)
		{//选出gap组的其中一组
		for (int i = j; i < n - gap; i += gap)
		{//对gap组的其中一组进行排序
		int end = i;
			int tmp = a[end + gap];
			while (end >= 0)
			{
				if (a[end] > tmp)
				{
					a[end + gap] = a[end];
					end -= gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = tmp;
		}

		}
		}
	}

代码实现法2(不想用tmp变量可以不用)

void ShellSort(int* a, int n)
{
	int gap = n;
	while (gap > 1)
	{
		gap = gap / 3 + 1;
		//间隔为gap的元素分为一组,总计gap组,gap每次减小,直至gap == 1
		for (int j = 0; j < gap; j++)
		{//选出gap组的其中一组
			int tmp = 0;
			for (int i = j; i < n - gap; i += gap)
			{//对gap组的其中一组进行排序
				int end = i;
				while (end >= 0)
				{
					if (a[end] > a[end + gap])
					{
						int tmp = a[end + gap];
						a[end + gap] = a[end];
						a[end] = tmp;
						end -= gap;
					}
					else
					{
						break;
					}
				}
			}

		}
	}
}

代码实现法3(从三层循环变为两层循环)

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)
			{
				if (a[end] > a[end + gap])
				{
					a[end + gap] = a[end];
					end -= gap;
				}
				else
				{
					break;
				}
				a[end + gap] = tmp;

			}


		}
	}
	}
  • 这样改的话其实是多组并排即多组一块排序
    希尔排序及其时间复杂度(图文详解),数据结构,排序算法,算法,数据结构

希尔排序的时间复杂度(O(n^1.3))

  • 希尔排序的时间复杂度其实是算不出准确数值的,但我们能探讨一下到底是因为什么才算不出来
  • 当gap很大时,假设gap = n / 3,每组插入次数为 1+2,总计gap组,则为n,所以时间复杂度为O(n)
  • 当gap很小时,因为gap = gap /3,每次循环gap越来越小,最后gap很小时,数组已经接近有序,时间复杂度也为O(n)
  • 假设gap为n/3,总计n/gap组,那么每组3个数组
    希尔排序及其时间复杂度(图文详解),数据结构,排序算法,算法,数据结构

每组插入(次数):1+2+3+…+( n / gap) - 1
总的插入次数:gap(1+2+3+…+(n / gap) - 1)
假设gap = gap / 3(gap = gap /3 + 1,1忽略点)
则gap = n/3
gap = n /9
gap = n / 27
将gap带入也是可以算的,但是随着gap的减小,数组前面的数组逐渐有序,它不是总是最坏情况下的(上面算的最坏情况下的),当gap为1时,如果还是最坏情况下计算的话,那么总插入次数为1+2+3+…+n - 1 约等于N^2,结果显然不是这样的
所以最后估计结果O(n^1.3)文章来源地址https://www.toymoban.com/news/detail-547804.html

到了这里,关于希尔排序及其时间复杂度(图文详解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【数据结构】排序算法复杂度 及 稳定性分析 【图文详解】

    【数据结构】排序算法复杂度 及 稳定性分析 【图文详解】

    前面给大家讲述了各大排序算法的原理、思路以及实现步骤、代码码源,下面让我们来对比一下各大排序之间的算法复杂度以及稳定性分析优劣,加深我们对于各排序算法的理解,帮助我们以后能更快的在具体场景下选择出最适的排序算法。 【数据结构】冒泡排序 (码源实

    2024年02月05日
    浏览(69)
  • 快速排序算法详解(原理,时间复杂度,实现代码)

    快速排序算法详解(原理,时间复杂度,实现代码)

    快速排序算法详解(原理、实现和时间复杂度) 快速排序是对冒泡排序的一种改进,由 C.A.R.Hoare(Charles Antony Richard Hoare,东尼·霍尔)在 1962 年提出。 快速排序的基本思想是 :通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另一部分的所有数据

    2024年02月13日
    浏览(11)
  • 时间复杂度的排序

    在计算机科学中,不同的算法有不同的时间复杂度。以下是一些常见的时间复杂度,并按照它们的增长速度从低到高排序: O(1) - 常数时间复杂度: 表示算法的执行时间是固定的,不随输入规模的增加而变化。例如,直接访问数组中的元素。 O(log n) - 对数时间复杂度: 表示算

    2024年01月21日
    浏览(7)
  • 八大排序算法(含时间复杂度、空间复杂度、算法稳定性)

    八大排序算法(含时间复杂度、空间复杂度、算法稳定性)

    下列算法默认都是对数组进行升序 1.1、算法思想 插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 插入排序的具体步骤如下: 从第一个元素开始,该元素可以认为已经被排序;

    2024年02月08日
    浏览(11)
  • 常见的排序算法的时间复杂度

    常见的排序算法的时间复杂度

    排序算法的时间复杂度通常取决于输入数据的规模(通常表示为n)。以下是一些常见排序算法及其平均、最好和最坏情况下的时间复杂度: 1、冒泡排序(Bubble Sort) 平均时间复杂度:O(n^2) 最好情况时间复杂度:O(n) 最坏情况时间复杂度:O(n^2) 冒泡排序通过重复地遍历待排序

    2024年04月13日
    浏览(13)
  • 排序算法的时间复杂度存在下界问题

    排序算法的时间复杂度存在下界问题

    对于几种常用的排序算法,无论是归并排序、快速排序、以及更加常见的冒泡排序等,这些排序算法的时间复杂度都是大于等于O(n*lg(n))的,而这些排序算法存在一个共同的行为,那就是这些算法在对元素进行排序的时候,都会进行同一个操作,也就是对数组中取出文件,然后

    2024年02月21日
    浏览(15)
  • 常见的排序算法及时间空间复杂度

    常见的排序算法及时间空间复杂度

    排序算法是计算机科学中的基本算法之一,它用于将一组数据按照某种顺序进行排列。下面是一些常见的排序算法,以及它们的思想和时间空间复杂度,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1. 冒泡排序 (Bubble Sort) - 思

    2024年02月07日
    浏览(10)
  • 详解时间复杂度和空间复杂度问题

    详解时间复杂度和空间复杂度问题

            前言:本来我并不认为时间复杂度和空间复杂的有多重要,只要日常会判断和分析算法的复杂度即可,但是,不论是在考研的数据结构与算法中,还是在日常的刷题中,我们都会见到,限制我们时间和空间复杂度的算法设计问题,这对我们要求就高了,所以,我们需

    2024年02月02日
    浏览(13)
  • 时间复杂度为 O(n) 的排序算法

    时间复杂度为 O(n) 的排序算法

    大家好,我是 方圆 。本文介绍线性排序,即时间复杂度为 O(n) 的排序算法,包括桶排序,计数排序和基数排序,它们都不是基于比较的排序算法,大家重点关注一下这些算法的适用场景。 桶排序 桶排序是分治策略的一个典型应用。它通过设置一些具有大小顺序的桶,每个桶

    2024年02月21日
    浏览(13)
  • 时间复杂度为 O(nlogn) 的排序算法

    时间复杂度为 O(nlogn) 的排序算法

    归并排序 归并排序遵循 分治 的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后合并这些子问题的解来建立原问题的解,归并排序的步骤如下: 划分 :分解待排序的 n 个元素的序列成各具 n/2 个元素的两个子序列,将长数组的排序

    2024年02月07日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包