排序算法总结之希尔排序

希尔排序是按照不同步长对元素进行插入排序,实质就是把一组元素分为很多小组各自进行排序。

该方法的基本思想是:先将整个待排元素序列分割成若干个子序列,分别进行直接插入排序,然后元素的分隔逐渐减少,当增量足够小(即为1时),再对全体元素进行一次插入排序,因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序时间效率比较高。

这里用下别人的图

以n=10的一个数组49, 38, 65, 97, 26, 13, 27, 49, 55, 4为例

第一次 gap = 10 / 2 = 5

49   38   65   97   26   13   27   49   55   4

1A                                        1B

        2A                                         2B

                 3A                                         3B

                         4A                                          4B

                                  5A                                         5B

这里就分了5组,每组都进行一次插入排序,完成之后,改变间距

第二次 gap = 5 / 2 = 2

排序后

13   27   49   55   4    49   38   65   97   26

1A             1B             1C              1D            1E

        2A               2B             2C             2D              2E

如图分为两组,再次进行插入排序,然后继续减小间距,知道间距为1,所以希尔排序就是把直接插入排序用了多回的算法 ,代码如下

void ShellSort(int a[],int N)//N是待排元素个数
{
	int tmp,i;
	for(int gap=N/2;gap>0;gap/=2)//希尔排序增量
		for(int j=gap;j=gap&&a[i-gap]>tmp;i-=gap)
					a[i]=a[i-gap];
				a[i]=tmp;
	}

}
希尔排序平均时间复杂度为O(n(1.3)),最好是O(n),最坏情况O(n(2)),并且是不稳定的



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