谢尔排序

算法原理

谢尔排序( Shellsort)的名称源于它的发明者 Donald Shell,该算法是冲破二次时间屏障的第一批算法之一,不过,直到它最初被发现的若干年后才证明了它的亚二次时间界。它通过比较相距一定间隔的元素来工作;各趟比较所用的距离随着算法的进行距离减小,直到只比较相邻元素的最后一趟排序为止。由于这个原因,谢尔排序有时也叫作缩减增量排序(diminishing increment sort)

算法图解

image.png

template <typename T>
void shellSort(vector<T> & v)
{
	for (int gap = v.size() / 2; gap > 0; gap/=2)
	{
		// 插入排序代码
		for (int i = gap; i < v.size(); i++)
		{
			T tmp = v[i];
			int j = i;
			for (; j >= gap && v[j - gap] > tmp; j -= gap)
			{
				v[j] = v[j - gap];
			}
			v[j] = tmp;
		}
	}
}

时间复杂度

最好:O(n)
最坏:O(nlog2n)
平均:O(nlog2n)

发布了9 篇原创文章 · 获赞 1 · 访问量 28

猜你喜欢

转载自blog.csdn.net/qq_43479736/article/details/105082481