【希尔排序和直接插入排序】

文章目录

  • 一. 直接插入排序
      • 代码实现:
      • 过程思想:
      • 性能分析:
  • 希尔排序
      • 基本思想:
      • 代码实现:
      • 特性总结:希尔排序由于gap的取值有很多方法和组,导致没有一定规律去计算,因此目前为止众多大佬通过大量实验证明例如,Knuth认为在关键没平均次数和对象平均移动次数大约在N的1.25到1.6N的1.25范围内,因此暂时按这个算。

一. 直接插入排序

  • 基本思想:当插入第i(i>=1)个元素时,前面的array[0],array[1],…array[i-1]已经排好序,此时用array[i]的排序码值与array[i-1],array[i-2],…array[0]的排序码值进行比较,找到符合位置即将array[i]插入,原来位置上即以后的元素顺序挨个后移一位。
  • 代码实现:

void InsertSort(int* arr, int n)
{
	for(int i = 0;i<n-1;i++)
	{
		int end = i;
		int tmp = arr[end+1];
		while(end>=0)
		{
			if(tmp<arr[end])
			{
				arr[end+1] = arr[end];
				end-=1;
			}
			else
				break;
		}
		arr[end+1] = tmp;
	}
}
  • 过程思想:

  • 【希尔排序和直接插入排序】_第1张图片

  • 性能分析:

  • 元素集合越接近有序,直接插入排序算法的时间效练就越高

  • 时间复杂度:o(N^2)

  • 空间复杂度:o(1)

  • 稳定性: 稳定

希尔排序

  • 基本思想:

  • 选定小于n的值为gap进行分组,进行预排序,当gap==1时,数组已经接近有序了,所以现在用直接插入就会很快。
  • 代码实现:

void ShellSort(int* a, int n)
{
	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(tmp<a[end])
				{	
					a[end+gap] = a[end];
					end-=gap;
				}
				else
					break;
			}
			a[end+gap] = tmp;
		}
	}
}
  • 特性总结:希尔排序由于gap的取值有很多方法和组,导致没有一定规律去计算,因此目前为止众多大佬通过大量实验证明例如,Knuth认为在关键没平均次数和对象平均移动次数大约在N的1.25到1.6N的1.25范围内,因此暂时按这个算。

1.时间复杂度o(N^1.23)
2. 稳定性:不稳定
3. 空间复杂度:o(1)

总结:gap越大,预排越快,越不接近有序。
gap越小,预排越慢,此时越接近有序。
当gap==1是就是直接插入排序,结果就有序了。

小白理解插入和希尔排序。

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