【算法】希尔排序

算法-希尔排序


前置知识
  • 一种基本排序,例如插入排序或冒泡排序

思路

此算法比任何其他排序算法都要鬼畜!请做好心理准备
我们现在有一个序列,怎么对它排序?
这是一个非常经典的问题,这里我们使用一个经典的鬼畜算法——希尔排序解决。

这里有一个序列,要对它升序排序(为便于取 gap \text{gap} gap,大小取 8 8 8)。
4 8 1 5 3 2 7 6 \begin{array}{cc} 4 & 8 & 1 & 5 & 3 & 2 & 7 & 6 \end{array} 48153276
然后取 gap = n 2 = 4 \text{gap}=\frac n 2=4 gap=2n=4,将相距等于 gap \text{gap} gap 的两个元素分为一组,此处将不同组使用不同颜色标出
4 8 1 5 3 2 7 6 \begin{array}{cc} \color{red}4 & \color{yellow}8 & \color{green}1 & \color{blue}5 & \color{red}3 & \color{yellow}2 & \color{green}7 & \color{blue}6 \end{array} 48153276
然后在每一组内进行排序(此时可自选一种其他排序,建议选取对较有序序列友好的算法。你要是直接启发式合并他不就变成归并了吗
3 2 1 5 4 8 7 6 \begin{array}{cc} \color{red}3 & \color{yellow}2 & \color{green}1 & \color{blue}5 & \color{red}4 & \color{yellow}8 & \color{green}7 & \color{blue}6 \end{array} 32154876
gap \text{gap} gap 减半,重新分组
3 2 1 5 4 8 7 6 \begin{array}{cc} \color{red}3 & \color{blue}2 & \color{red}1 & \color{blue}5 & \color{red}4 & \color{blue}8 & \color{red}7 & \color{blue}6 \end{array} 32154876
继续操作,直至 gap \text{gap} gap 降为 1 1 1,即只剩下一组
1 2 3 5 4 6 7 8 \begin{array}{cc} \color{red}1 & \color{blue}2 & \color{red}3 & \color{blue}5 & \color{red}4 & \color{blue}6 & \color{red}7 & \color{blue}8 \end{array} 12354678
1 2 3 5 4 6 7 8 \begin{array}{cc} \color{red}1 & \color{red}2 & \color{red}3 & \color{red}5 & \color{red}4 & \color{red}6 & \color{red}7 & \color{red}8 \end{array} 12354678
1 2 3 4 5 6 7 8 \begin{array}{cc} \color{red}1 & \color{red}2 & \color{red}3 & \color{red}4 & \color{red}5 & \color{red}6 & \color{red}7 & \color{red}8 \end{array} 12345678


算法参数
  • 平均时间复杂度: O ( n 1.3 ) O(n^{1.3}) O(n1.3)
  • 最好时间复杂度: O ( n log ⁡ n ) O(n\log n) O(nlogn)
  • 最坏时间复杂度: O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度:取决于选取的辅助排序算法
  • 注:以上时间复杂度不准确,实际复杂度取决于 gap \text{gap} gap,目前无法准确求解

实现代码

此处使用插入排序作为辅助排序

void InsertionSort(int a[],int n,int x,int gap){
	int tmp=a[i],j;
	for (j=x;j>=gap&&a[j-gap]>tmp;j-=gap)
		a[j]=a[j-gap];
	a[j]=tmp;
}
void ShellSort(int a[],int n){
	for (int gap=n/2;gap>=1;gap/=2)
    	for (int i=1;i<gap;i++)
        	InsertionSort(a,n,x,gap);
}

练习
  • 洛谷【模板】排序(看你写的怎么样,写的好才能勉强过

你可能感兴趣的:(算法,#,排序,算法,排序算法,c++)