黑马程序员技术交流社区
标题:
求希尔排序的代码和解析
[打印本页]
作者:
韩基鑫
时间:
2014-3-18 21:03
标题:
求希尔排序的代码和解析
本帖最后由 韩基鑫 于 2014-3-19 15:30 编辑
毕老师在视频中说,希尔排序是最快的排序方法,网上的没看懂,希望高手们帮帮忙,谢谢
作者:
zhxu188
时间:
2014-3-18 21:29
所谓希尔排序就是分组插入排序,比如一组数{2,5,4,1,8,6},第一步先两个一组,再组内排序{2,5} {1,4} {6,8},然后再分成两组,组内在排序{1,2,4,5} {6,8} 最后再合并{1,2,4,5,6,8},排序完成,这是以前老师上课大概讲的,现在就记得这么多了,希望能帮助你
作者:
syw02014
时间:
2014-3-18 21:44
希尔排序(缩小增量法) 属于插入类排序,由Shell提出,希尔排序对直接插入排序进行了简单的改进:它通过加大插入排序中元素之间的间隔,并在这些有间隔的元素中进行插入排序,从而使数据项大跨度地移动,当这些数据项排过一趟序之后,希尔排序算法减小数据项的间隔再进行排序,依次进行下去,进行这些排序时的数据项之间的间隔被称为增量,习惯上用字母h来表示这个增量。
常用的h序列由Knuth提出,该序列从1开始,通过如下公式产生:
h = 3 * h +1
反过来程序需要反向计算h序列,应该使用
h=(h-1)/3
public static void shellSort(int[] arr) // 计算出最大的h值
{
int h=1;
while(h<=arr.length/3)
h=h*3+1;
while(h>0)
{
for(int i=h;i<arr.length;i+=h)
{
if(arr[i]<arr[i-h])
{
int tmp=arr[i];
int j=i-h;
while(j>=0&&arr[j]>tmp)
{
arr[j+h]=arr[j];
j-=h;
}
arr[j+h]=tmp;
}
}
h=(h-1)/3; // 计算出下一个h值
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2