黑马程序员技术交流社区

标题: 高手帮忙看看这个排序方法怎么排的 [打印本页]

作者: 何旭栋    时间: 2012-7-3 21:31
标题: 高手帮忙看看这个排序方法怎么排的
本帖最后由 何旭栋 于 2012-7-5 02:19 编辑
  1. public void ShellSort(int[] arr) {
  2.                 int Index, Temp, x;
  3.                 int Length = arr.length;
  4.                 int DataLen = Length >> 1;
  5.                
  6.                 while (DataLen != 0) // 数列仍可进行分割
  7.                 {
  8.                         for (x = DataLen; x < Length; x++) {
  9.                                 Temp = arr[x];
  10.                                 Index = x - DataLen; // 计算进行处理的位置
  11.                                 // 进行集合内数值的比较与交换值
  12.                                 while (Index >= 0 && Temp < arr[Index]) {
  13.                                         arr[Index + DataLen] = arr[Index];
  14.                                         Index = Index - DataLen;
  15.                                 }<font color="#ff0000">//这个while循环有点看不懂,高手帮忙讲解下</font>
  16.                                 // 与最后的数值交换
  17.                                 arr[Index + DataLen] = Temp;
  18.                         }
  19.                         DataLen = DataLen >> 1; // 计算下次分割的间隔长度
  20.                 }
  21.         }
复制代码
记得毕老师讲排序时候说过希尔排序,上网找了希尔排序看看,结果看了半天没搞懂。。。
作者: 陆强强    时间: 2012-7-3 23:53
本帖最后由 陆强强 于 2012-7-4 00:37 编辑

第一次数组折半:x和0的值比,X的值小,arr[Index + DataLen] = arr[x - DataLen+ DataLen]=arr[x]=arr[Index];
Index = Index - DataLen;然后内while结束出来arr[Index + DataLen] =arr[Index - DataLen+ DataLen]=arr[Index]=Temp;
所以Temp = arr[x];
arr[x]=arr[Index];
arr[Index]=Temp;这是什么,换位


如果x对应的值大于0角标的值,内while不进去,arr[Index + DataLen] = Temp;//arr[x-DataLen+ DataLen]]=arr[x]不换位
所以然后x+1和1的值比,x+2和2比一直下去到x=length-1和DataLen-1(数组长度为奇数,偶数时这里是DataLen)比一次;
比完DataLen再折半一次继续上面的循环
最后一次折半DataLen一定是1,然后每次都是x和x-1的值比。比完因为1》1=0所以外循环结束。得出结果。

未命名.JPG (25.34 KB, 下载次数: 20)

未命名.JPG

作者: 陆强强    时间: 2012-7-4 00:39
蛋疼的论坛编辑系统害我弄了好几次
作者: 何旭栋    时间: 2012-7-5 02:23
本帖最后由 何旭栋 于 2012-7-5 02:24 编辑

谢谢了,终于看明白了,这个确实效率比选择排序高,就是代码实现有点复杂
断了一天网,现在要睡觉了才连接上,蛋痛啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2