排序之希尔排序

原创 2015年11月20日 11:58:22
Shell Sort
希尔排序(Shell Sort)是插入排序的一种。是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。
该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下,效率是很高的,因此希尔排序在时间效率上比直接插入排序有较大提高。


在网上找到了演示图。


在上面这幅图中:
初始时,有一个大小为 10 的无序序列。
在第一趟排序中,我们不妨设 gap1 = N / 2 = 5,即相隔距离为 5 的元素组成一组,可以分为 5 组(21和54,一组,4和47一组……)。
接下来,按照直接插入排序的方法对每个组进行排序(变成了21和54比较,21在前面,4和47比较,4在前面……)。
在第二趟排序中,我们把上次的 gap 缩小一半,即 gap2 = gap1 / 2 = 2 (取整数)。这样每相隔距离为 2 的元素组成一组,可以分为 2 组。
按照直接插入排序的方法对每个组进行排序。
在第三趟排序中,再次把 gap 缩小一半,即gap3 = gap2 / 2 = 1。 这样相隔距离为 1 的元素组成一组,即只有一组。
按照直接插入排序的方法对每个组进行排序。此时,排序已经结束。
需要注意一下的是,若序列为(8,2,4,3,1,2),经过第一次排序变成(4,1,8,2,2,3)第一个2经过变换,变到了后面。也就是说,在排序过程中,两个相同元素的位置交换了。

所以,希尔排序是不稳定的算法。

#include<iostream>

using namespace std;
/*****
function shellsort to sort
********/ 
void shellsort(int a[],int n)
{
	//gap become half
	for(int gap = n / 2; gap > 0; gap /= 2)
	{
		//the number of groups is gap
		for(int i = 0; i < gap; i++)
		{
			//insertion sort in each group
			for(int j = i + gap; j < n; j += gap)
			{
				if(a[j] < a[j - gap])
				{
					int tmp = a[j];
					int k = j;
					while(k > 0 && a[k - gap] > tmp)
					{
						a[k] = a[k - gap];
						k -= gap;
					}
					a[k] = tmp;
				}
			}
		}
	}
	
}
/*****
main function to check
********/ 
int main()
{
	int n,a[101];
	cin>>n;
	
	for(int i =0; i < n; i++)
	{
		cin>>a[i];
	}
		
	shellsort(a,n);
	
	for(int i =0; i < n; i++)
	{
		cout<<a[i]<<" ";
	}
	cout<<endl;
	return 0;
} 


版权声明:本文为博主原创文章,未经博主允许不得转载。

经典排序之希尔排序

希尔排序 基本思想: 将待排序的序列分为若干组,在每组内进行直接插入排序,以使整个序列基本有序,然后再对整个序列进行直接插入排序。 该方法实质上是一种分组插入方法。 具体来说,先取一个小于n的整数d1...
  • Jaster_wisdom
  • Jaster_wisdom
  • 2016年05月24日 18:22
  • 1075

希尔排序

给你10个指定的数字12,2,16,30,28,10,16,20,6,18,用希尔排序的方法把这十个数从小到大的排列 定义一个顺序表,对顺序表进行初始化赋值存入这十个数字,然后用希尔排序进行排序。希...
  • Interneting_Plus
  • Interneting_Plus
  • 2016年11月13日 12:31
  • 469

希尔排序

算法思想:希尔排序是分组插入的方法。按照增量将数组分割成n组,在每一组中进行直接插入排序。然后改变增量大小,继续进行直接插入排序。最后的增量必须为1,就是所有记录在同一组进行直接插入排序。算法优点:为...
  • superxiaolong123
  • superxiaolong123
  • 2017年03月08日 10:25
  • 218

白话经典算法系列之三 希尔排序的实现

希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。   该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别...
  • MoreWindows
  • MoreWindows
  • 2011年08月08日 11:41
  • 190578

希尔排序

对于大规模乱序数组插入排序很慢,因为它只会交换(比较)相邻的元素,因此元素只能一点一点地从数组的一端移动到另一端。希尔排序为了加快速度简单地对插入排序进行了改进,交换不相邻的元素以对数组的局部进行排序...
  • shi1451042748
  • shi1451042748
  • 2016年02月22日 21:58
  • 215

排序算法之希尔排序

同样的先上这张图 下面分析希尔插入排序: 希尔排序将序列根据增量d分成几个子序列,对每个子序列作插入排序。然后把增量d变为d/2,重复这个过程直到d=1,这时的希尔排序其实就是插入排序。 ...
  • xingxinmanong
  • xingxinmanong
  • 2016年09月13日 09:28
  • 302

数据结构实验之排序六:希尔排序 【OJ--3403】

题目描述 我们已经学习了各种排序方法,知道在不同的情况下要选择不同的排序算法,以期达到最好的排序效率;对于待排序数据来说,若数据基本有序且记录较少时,直接插入排序的效率是非常好的,希尔排序就是针...
  • zhang_di233
  • zhang_di233
  • 2015年12月23日 19:05
  • 1090

3403 数据结构实验之排序六:希尔排序

数据结构实验之排序六:希尔排序#include using namespace std; int n,a[10010]; void Shell_sort(int *a,int dk) { ...
  • yue_luo_
  • yue_luo_
  • 2016年12月11日 21:34
  • 154

数据结构系列之希尔排序详解

基于插入排序的希尔排序Java实现
  • fengyinchao
  • fengyinchao
  • 2015年05月27日 09:25
  • 1887

Java八大排序算法之"希尔排序(最小增量排序)"算法

希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。 ————...
  • www_wangjun
  • www_wangjun
  • 2017年06月15日 15:58
  • 266
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:排序之希尔排序
举报原因:
原因补充:

(最多只允许输入30个字)