首页 > 其他 > 详细

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

时间:2014-01-21 09:33:16      阅读:349      评论:0      收藏:0      [点我收藏+]

希尔排序(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


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

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

bubuko.com,布布扣



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

#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;
	}
		
}

运行效果如下:


bubuko.com,布布扣




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

原文:http://blog.csdn.net/u010236550/article/details/18264273

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!