插入排序、希尔排序----C语言数据结构

目录

    • 引言
  • 1.插入排序的实现思想
  • 1.1插入排序的时间复杂度及优缺分析
  • 2.希尔排序的实现思想
  • 2.1希尔排序的时间复杂度

引言

插入排序(Insertion Sort)是一种简单而直观的排序算法,它的基本思想是逐步构建有序序列。在每次迭代中,插入排序从未排序的元素中取出一个元素,将其插入到已经排好序的部分,使得插入后仍然保持有序。这个过程类似于我们打扑克牌时逐个将手中的牌插入到已经有序的牌中。

插入排序的用途:

  1. 小型数据集排序: 插入排序对于小型数据集的排序非常高效,因为其简单的实现和较低的常数因子使得在这种情况下性能表现良好。

  2. 部分有序数组:如果数组已经部分有序,即大部分元素已经有序,插入排序的性能较好。这是因为大部分元素不需要移动,只有少数元素需要在已排序部分中找到合适的位置插入。

  3. 在线算法: 插入排序是一种在线算法,即可以逐个处理输入数据而无需等待所有数据都可用。这在某些实时应用或需要逐步处理数据的情境中很有用。

  4. 链表排序: 插入排序在链表上的实现相对简单,因为在链表中插入一个元素不需要移动其他元素,只需调整指针。

1.插入排序的实现思想

插入排序的实现思想是:将后面的无序的数据插入到前面,使前部分的数据为有序,
循环往复,直至整个数组有序

插入排序、希尔排序----C语言数据结构_第1张图片

// 插入排序
void InsertSort(int* a, int n)
{//再考虑多趟,外层循环
	for(int i=0;i<n-1;i++)
	{
		//先考虑单趟,每个元素与前面数组比较,小的话往前排
		int end = i;
		int tmp = a[end+1];
		while (end >= 0)
		{
			if (a[end] >= tmp)
			{
				a[end + 1] = a[end];
				end--;
			}
			else
				break;
		}
		a[end+1] = tmp;
	}
}

1.1插入排序的时间复杂度及优缺分析

最优:在插入排序中,当待排序数据为有序时,此时为最优,此时插入排序只需要比较每个元素和其前面的元素一次,无需进行交换操作。因此,最好情况时间复杂度为 O(n)

最差:最坏情况是输入数组是逆序的,此时插入排序需要对每个元素进行 n 次比较和 n 次移动。每次比较和移动的复杂度是 O(1),所以最坏情况的时间复杂度是 O(n^2)

平均:在平均情况下,插入排序的时间复杂度为 O(n^2)。这是因为对于每个未排序的元素,平均需要比较 n/2 次(在有序的部分中找到插入位置),而每次比较的复杂度是 O(1)。总的比较次数是 n/2 * n,导致平均 时间复杂度为 O(n*2)

时间复杂度为 O(n*2)

优缺:
对小规模数据集效率高,在小规模数据集上,插入排序的性能较好。由于它的基本操作是逐个比较和交换,因此在元素较少时,操作的开销相对较小。
在大规模数据集上性能表现较差。特别是在最坏情况下,即输入数组逆序的情况下,时间复杂度最高

2.希尔排序的实现思想

希尔排序又称为缩小增量排序,是对之前介绍的插入排序的一种优化版本,优化的地方在于:不用每次插入一个元素时,就和序列中有序部分中的所有元素进行比较。

该方法的基本思想是:设待排序元素序列有n个元素,首先取一个整数gap(小于序列元素总数)作为间隔,所有间隔为gap的元素放在同一个逻辑数组中,在每一个逻辑数组中分别实行直接插入排序。然后缩小间隔gap,重复上述逻辑数组划分和排序工作。直到最后取gap=1,将所有元素放在同一个数组中排序为止。

整个步骤:
1.接近有序 (外层循环)
2.在每次排序中(也就是插入算法来实现预排序,为内层循环)
3.使其变成有序(最后一个循环)
逻辑:
插入排序、希尔排序----C语言数据结构_第2张图片

// 希尔排序
void ShellSort(int* a, int n)
{
	//希尔排序是在插入排序的基础上实现的
	//步骤为:1预排序 (目的是让数据接近有序)
	//2 插入排序   (目的是让数据有序)
	int gap = n;
	while(gap>1)
	{
		//再排多趟
		//最后要保证gap=1,让其变成有序
		gap = gap / 3 + 1;
		//先以一组gap的间隔去排一趟
		for (int i = 0;i < n - gap;i += 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.1希尔排序的时间复杂度

希尔排序在最坏情况下的时间复杂度为O(n2),平均情况下的时间复杂度为O(n1.3)

希尔排序的平均时间复杂度依赖于间隔序列的选择。对于一些较好的间隔序列,希尔排序的平均时间复杂度可以在 O(n log^2 n) 到 O(n^1.5) 之间。

希尔排序的最好情况时间复杂度也取决于所选的间隔序列。对于某些好的序列,最好情况时间复杂度可以达到 O(n log n) 级别。然而,通常情况下,希尔排序的最好情况时间复杂度并不是主要关注点。

你可能感兴趣的:(数据结构,数据结构,c语言,排序算法)