(排序3)希尔排序时间复杂度与直接选择排序

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

TIPS

  1. 希尔排序分组预排的目的就在于比如说我要对数据进行升序排序,那么就是可以达到让大的数尽快的调到后面
  2. 然后接下来随着gap的不断缩小,间隔越来越小,组也就越来越多,最终整个数组的话是越来越接近有序。
  3. 最终的话,你必须要保证这个gap为1,就是说最终必须得进行一次直接插入排序。但此时此刻的直接插入排序是建立在当前这个数组已经是接近有序的情况之下,因此他的时间复杂度远远不用O(N^2),而是O(N)量级

希尔排序的时间复杂度

  1. 首先对于这个gap之间蕴含的数量关系必须得搞清楚
    1. 被分成gap组。
    2. 每组的成员下表只要再加上gap就会跳到下一个同组成员(当然也是同一组的)。
    3. 在每组当中,成员与成员之间隔着gap-1个元素。
  2. 希尔排序代码:
void ShellSort(int* arr, int n)
{
	int gap = n;
	while (gap > 1)
	{
		gap /= 2;
		for (int j = 0; j < gap; j++)
		{
			for (int i = j; i < n - gap; i += gap)
			{
				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;
			}
		}
	}
}
  1. 先先看外面的这个while循环,这个while循环的话大概需要走logN次。
  2. 然后接下来去观察这个while循环里面,在最开始的时候,这个gap很大,比如说是n/2,这时候你依据一下之前讲的有关于gap的数量关系,你会发现里面的数量级应该是O(N)。
  3. 那么如果分析最后情况的话,在最后的时候,这个gap很小,比如说最后gap变为一,这时候根据之前还是讲过的那个有关于gap的数量关系,你会发现里面的数量级还是O(N),虽然说直接插入排序,它的时间复杂度是N^2,但是这边的话主要是前面已经经过了大量的预排序,所以说整个数组已经变得非常非常有序了,所以说他的量级就O(N)。
  4. 所以说希尔排序的话,它的时间复杂度总体上跟堆排序差不多,也是NlogN这个量级,实际上应该是比这个量级还要大一点的.
  5. 所以说这个只需要记个结论就可以,希尔排序的时间复杂度是N的1.3次方。
  6. (排序3)希尔排序时间复杂度与直接选择排序
  7. (排序3)希尔排序时间复杂度与直接选择排序
  8. (排序3)希尔排序时间复杂度与直接选择排序

(排序3)希尔排序时间复杂度与直接选择排序文章来源地址https://www.toymoban.com/news/detail-400932.html

选择排序

  1. 首先先去定义一下左右边界lefti, righti,然后先去遍历一下从左边界到右边界,然后在这个遍历的过程当中去记录一下最大的值的下标maxi与最小的值的下标mini。然遍历完之后得到这两个下标之后,去把它们分别与左右边界进行交换。然后再把左右边界分别缩短一个,再去进行遍历
  2. left, right, maxi, mini都是下标
void Swap(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}
void SelectSort(int* arr, int n)
{
	int lefti = 0;
	int righti = n - 1;
	while (lefti < righti)
	{
		int mini = lefti;
		int maxi = lefti;
		for (int i = lefti; i <= righti; i++)
		{
			if (arr[i] > arr[maxi])
			{
				maxi = i;
			}
			if (arr[i] < arr[mini])
			{
				mini = i;
			}
		}
		Swap(arr + lefti, arr + mini);
		Swap(arr + righti, arr + maxi);
		lefti++;
		righti--;
	}
}
  1. 然后再去扪心自问一下,仅仅就上面的这些代码正确吗?实际上这边有个特别大的漏洞,比如说当你把lefti与mini运行交换了之后,万一此时此刻我的maxi就是lefti,那么这样你事先交换完了,相当于就是把我的这个maxi所指向的真实的最大值给换走了,因此需要去特判一下,如果说maxi与lefti相等,那么我就知道maxi已经被调包掉了,并且最大值的下标此时此刻已经是mini了,于是就maxi=mini
void Swap(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}

void SelectSort(int* arr, int n)
{
	int lefti = 0;
	int righti = n - 1;
	while (lefti < righti)
	{
		int mini = lefti;
		int maxi = lefti;
		for (int i = lefti; i <= righti; i++)
		{
			if (arr[i] > arr[maxi])
			{
				maxi = i;
			}
			if (arr[i] < arr[mini])
			{
				mini = i;
			}
		}
		Swap(arr + lefti, arr + mini);
		if (maxi == lefti)
		{
			maxi = mini;
		}
		Swap(arr + righti, arr + maxi);
		lefti++;
		righti--;
	}
}

选择排序时间复杂度

  1. 时间复杂度O(N^2)。
  2. 并且不管最好与最坏情况,都是N^2。就是说需要排序的一个序列,不管怎么样对这个选择排序的性能是没有任何影响,管你无序还是接近有序呢。
  3. 为什么是属于N的平方级别?你就去想想整个的遍历过程,一开始需要去遍历n个,然后n-2个,然后n-4个,然后以此不断递减,是一个标标准准的等差数列,所以到时候总和加起来肯定是O(N^2)
  4. (排序3)希尔排序时间复杂度与直接选择排序

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

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

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

相关文章

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

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

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

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

    2024年04月13日
    浏览(34)
  • 插入,选择,堆,快速排序算法思想与复杂度

    目录 插入排序 思想 算法步骤 代码 复杂度 选择排序 思想 算法步骤 代码 复杂度 堆排序  思想 算法步骤 代码 复杂度  快速排序  思想 算法步骤 代码 复杂度 稳定性 插入排序是一种简单直观的排序算法。它的工作原理是将数组分为 已排序 和 未排序 两部分,然后依次将未

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

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

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

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

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

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

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

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

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

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

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

    大家好,我是 方圆 。对于小规模数据,我们可以选用时间复杂度为 O(n 2 ) 的排序算法,因为时间复杂度并不代表实际代码的执行时间,而且它也省去了低阶、系数和常数,仅代表的增长趋势,所以在小规模数据情况下, O(n 2 ) 的排序算法可能会比 O(nlogn) 的排序算法执行效率

    2024年02月07日
    浏览(48)
  • 时间复杂度接近O(n)的三种排序算法

    桶排序,顾名思义,会用到“桶”,核心思想是将要排序的数据分到几个有 序的桶里,每个桶内的数据再单独进行排序。桶内排完序之后,再把每个桶内的数据按照顺序依次 取出,组成的序列就是有序的了。 桶排序对要排序数据的要求是非常苛刻的。 首先,要排序的数据需

    2024年02月14日
    浏览(44)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包