Sorting Algorithm-Shell Sort

Shell Sort-希尔排序

Algorithm:

希尔排序是D.L.Shell于1959年提出来的一种排序算法,在这之前排序算法的时间复杂度基本都是O(n^2)的,希尔排序算法是突破这个时间复杂度的第一批算法之一。
将相距某个"增量"的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果是基本有序而不是局部有序。
Ex:
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

第二次:步长为2
第一组:13,27,49,55,04
第二组:49,38,65,97,76
对每组直接插入排序后    04,13,27,49,55,38,49,65,76,97

第三次:步长为1(最后步长必须是1)
最终结果: 04,13,27,38,49,49,55,65,76,97

Code:

void Shell_Sort(vector<int> &v)  //步长为n/2...依次
   {
	int gap =(v.size()/2);  //初始步长
	while (gap > 0)   //最后必为1
	{
		for (int i = gap; i < v.size(); i++)
		{
			int j = i-gap;
			int key = v[i];
			while (j>=0 && v[j]>key)
			{
				v[j+gap] = v[j];
				j = j - gap;
			}
			v[j+gap] = key;
		}
		gap /= 2;
	}	
   }

Analysis:

希尔排序的关键并不是随便分组后各自排序,而是将相隔某个"增量"的记录组成一个子序列,实现跳跃式的移动,使得排序的效率提高。
这里的"增量"的选取就非常关键了,目前还是一个数学难题,迄今为止还没有人找到一种最好的增量序列。不过大量的研究表明,当增量序列为dlta[k]=2^(t-k+1)-1(0<=k<=[log2(n+1)])时,可以获得不错的效果,其时间复杂度为O(n^1.5),要好于直接排序O(n^2)。需要注意的是,增量序列的最后一个增量必须等于1。另外由于记录是跳跃式的移动,希尔排序并不是一种稳定的排序算法。
希尔算法的发明,使得我们终于突破了慢速排序的时代(超越了时间复杂度为O(n^2)),之后,相应的更为高效的排序算法也就相继出现了。
unstable sort




你可能感兴趣的:(希尔排序)