您的位置:首页 > 运维架构 > Shell

希尔排序(Shell Sort)--学习(四)

2014-01-14 15:36 489 查看

希尔排序(Shell Sort)

基本思想:

  先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

 该方法实质上是一种分组插入方法。

给定实例的shell排序的排序过程



 假设待排序文件有10个记录,其关键字分别是:

49,38,65,97,76,13,27,49,55,04。

 增量序列的取值依次为:

5,3,1

体会:一个> 或< 符号可能是致命的影响

不太清楚原理最好看看:排序过程如【动画模拟演示



经过了半天的折腾终于搞定了,下面是我的代码

#include<iostream>
using namespace std;

void ShellSort(int arr[], int len);
void main()
{
	int a[]={49,38,65,97,76,13,27,49,55,04};
	ShellSort(a,10);
	cout<<"排序完成后"<<endl;
	for (int i=0; i<10; i++)
	{
		cout<<a[i]<<endl;
	}
	system("pause");
}

void ShellSort(int arr[], int len)
{
	int j,k,temp;
	j = len/2;
	for (j; j>= 1; j /=2)//确定增量
	{
		for (k =j; k<len;k++)//从数组增量到末尾的判断
		{ 
			
			if (arr[k] < arr[k-j])//对分组的进行插入排序
			{	
				temp = arr[k];
				int s =k-j;
				while (arr[s] > temp)
				{
					arr[s +j] = arr[s];
					s-=j;
				}
				arr[s+j] = temp;
							
			}	
		}
		cout<<"**********"<<"增量"<< j << "**********"<<endl;
		for (int g=0; g<10; g++)
		{
			cout<<arr[g];
			cout<<",";
		}
		cout<<""<<endl;
	}
		
}


运行效果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: