常用排序之希尔排序法

算法描述
        希尔排序是插入排序的一种,也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。
具体描述如下:
       假如有一个大小为n数组,一般取一个增量d=n/2,将数组的元素进行分组。 所有距离为d的倍数的元素被分到一组中,先在各组内进行直接插入排序。再取第二个增量d2重复上述分组和排序,直至所取增量为1,此时所有记录放在同一组中进行直接插入排序。


改进的目的基于以下两点:

    1.插入排序在对几乎已经排好的数据操作时,效率高,此时为线性排序的效率。
    2.但插入排序每次只能将数据移动一位,乱序时是低效的。

例如:

假设一个数组为 49, 38, 65, 97, 76, 13, 27, 49, 55, 04

增量的取值依次为5, 3, 1

----------------------------------------------------------------------------------

初始序列:49   38   65   97   76   13   27   49   55   04

增量5分组:(49,13)  (38,27)  (65,49)  (97,55)  (76,04)

一趟排序后:13   27   49   55   04   49   38   65   97   76

增量3分组:(13,55,38,76)  (27,04,65)  (49,49,97)

二趟排序后:13   04   49   38   27   49   55   65   97   76

增量1分组:13   04   49   38   27   49   55   65   97   76

三趟排序后:04   13   27   38   49   49   55   65   76   97

-----------------------------------------------------------------------------------

例程

void Shell_sort(int a[], int n)
{
	int i, j, Increment, temp;
	for (Increment = n / 2; Increment > 0; Increment /= 2) {
	    for (i = Increment; i < n; i++) {
	        temp = a[i];
		for (j = i; j >= Increment; j -= Increment) {
		    if (a[j - Increment] > temp)
		        a[j] = a[j - Increment];
		    else
		        break;
		}
		a[j] = temp;
	    }
	}
}
int main()
{
	int b[] = { 9,8,19,4,6,2,3,7,4 };
	Shell_sort(b, 9);
	for (auto c : b)
		cout << c << " ";
	system("pause");
}
插入排序的时间复杂度分析
        希尔排序的时间复杂度与增量的选取有关,希尔排序时间复杂度的下界是n*log2n。希尔排序没有快速排序算法O(n(logn)),因此中等大小规模表现良好,对规模非常大的数据排序不是最优选择。但是比O(n^2)复杂的算法快得多。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值