码迷,mamicode.com
首页 > 编程语言 > 详细

排序算法——希尔排序

时间:2016-05-12 23:57:32      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本,希尔排序是非稳定排序算法。 

希尔排序是基于插入排序的以下两点性质而提出改进方法的:

1>插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率;

2>插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。

希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。 

基本思想:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前种方法有较大提高。

 

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

第一次 gap = 10 / 2 = 5

技术分享

1A,1B,2A,2B等为分组标记,数字相同的表示在同一组,大写字母表示是该组的第几个元素, 每次对同一组的数据进行直接插入排序。即分成了五组(49, 13) (38, 27) (65, 49)  (97, 55)  (26, 4)这样每组排序后就变成了(13, 49)  (27, 38)  (49, 65)  (55, 97)  (4, 26),下同。

第二次 gap = 5 / 2 = 2

排序后

技术分享

就是将1A 1B1C1D 1E和22B2C22E分别进行排序,得到:

4   26   13   27   38    49   49   55   97   65

第三次 gap = 2 / 2 = 1

 4   26   13   27   38    49   49   55   97   65

1A   1B  1C    1D   1E    1F    1G   1H    1I    1J

第四次 gap = 1 / 2 = 0 排序完成得到数组:

4   13   26   27   38    49   49   55   65   97

附注:上面希尔排序的步长选择都是从n/2开始,每次再减半,直到最后为1。

两种希尔排序的伪代码如下:

//希尔排序

void shellsort(int a[],int n)
{
	int i,j,gap;
	for(gap=n/2;gap>0;gap/=2)//gap为步长
	{
		for(i=0;i<gap;i++)
		{
			for(j=gap+i;j<n;j++)
			{
				if(a[j]<a[j-gap])
				{
					int temp=a[j];
					int k=j-gap;
					while(k>=0&&a[k]>temp)
					{
						a[k+gap]=a[k];
						k-=gap;
					}
					a[k+gap]=temp;
				}
			}
		}
	}
}

void shellsort(int a[],int n)
{
	int i,j,gap;
	
	for(gap=n/2;gap>0;gap/=2)
	{
		for(i=gap;i<n;i++)
		{
			for(j=i-gap;j>=0&&a[j]>a[j+gap];j-=gap)
				swap(a[j],a[j+gap]);
		}
	}
}

备注:希尔排序是对直接插入排序的改进

排序算法——希尔排序

标签:

原文地址:http://blog.csdn.net/duan19920101/article/details/51346576

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!