黑马程序员技术交流社区
标题:
高手帮忙看看这个排序方法怎么排的
[打印本页]
作者:
何旭栋
时间:
2012-7-3 21:31
标题:
高手帮忙看看这个排序方法怎么排的
本帖最后由 何旭栋 于 2012-7-5 02:19 编辑
public void ShellSort(int[] arr) {
int Index, Temp, x;
int Length = arr.length;
int DataLen = Length >> 1;
while (DataLen != 0) // 数列仍可进行分割
{
for (x = DataLen; x < Length; x++) {
Temp = arr[x];
Index = x - DataLen; // 计算进行处理的位置
// 进行集合内数值的比较与交换值
while (Index >= 0 && Temp < arr[Index]) {
arr[Index + DataLen] = arr[Index];
Index = Index - DataLen;
}<font color="#ff0000">//这个while循环有点看不懂,高手帮忙讲解下</font>
// 与最后的数值交换
arr[Index + DataLen] = Temp;
}
DataLen = DataLen >> 1; // 计算下次分割的间隔长度
}
}
复制代码
记得毕老师讲排序时候说过希尔排序,上网找了希尔排序看看,结果看了半天没搞懂。。。
作者:
陆强强
时间:
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, 下载次数: 32)
下载附件
2012-7-4 00:10 上传
作者:
陆强强
时间:
2012-7-4 00:39
蛋疼的论坛编辑系统害我弄了好几次
作者:
何旭栋
时间:
2012-7-5 02:23
本帖最后由 何旭栋 于 2012-7-5 02:24 编辑
谢谢了,终于看明白了,这个确实效率比选择排序高,就是代码实现有点复杂
断了一天网,现在要睡觉了才连接上,蛋痛啊
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2