shellsort

先复习一遍插入排序:

template<typename T>
void insertionsort(T arr[], int len)
{
	for (int i = 1; i < len; ++i)
	{
		T e = arr[i];
		int j;
		for (j = i; j > 0 && arr[j-1] > e ; --j)
		{
			arr[j] = arr[j - 1];
		}
		arr[j] = e;
	}
}

在插入排序的基础上对算法进行改进:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。

template<typename T>
void shellsort(T arr[], int len)
{
	int step;
	for (step = len / 2; step != 0; step /= 2)//初始步长设置为len/2,但步长为len/2并不一定是最优步长。
	{
		for (int i = 1; i<len; i++)
		{
			T temp = arr[i];
			int j = i;
			for (; j-step>0 && arr[j - step]>temp; j -= step)
			{
				arr[j] = arr[j - step];
			}
			arr[j] = temp;
		}
	}
}

测试:在这里我们生成一个0-100之间的1000 0000个随机数进行排序。

int main()
{
    int n=10000000;
    int *arr=generateArray(n,0,100);
    sortTest("selection sort",selectionsort,arr,n);
    delete[] arr;
	return 0;
}

可以看到,排序时间只用了2.391s,比直接插排或者选择排序不知快到里那里去.....

转载于:https://my.oschina.net/0eb1/blog/850013

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值