java 板


LINE

这个连结是中文维基百科的合并排序法 https://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F 在 java 的叠代版程式如下 public static void merge_sort(int[] arr) { int len = arr.length; int[] result = new int[len]; int block, start; // 原版代码的迭代次数少了一次,没有考虑到奇数列数组的情况 for(block = 1; block < len*2; block *= 2) { for(start = 0; start <len; start += 2 * block) { int low = start; int mid = (start + block) < len ? (start + block) : len; int high = (start + 2 * block) < len ? (start + 2 * block) : len; //两个块的起始下标及结束下标 int start1 = low, end1 = mid; int start2 = mid, end2 = high; //开始对两个block进行归并排序 while (start1 < end1 && start2 < end2) { result[low++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++]; } while(start1 < end1) { result[low++] = arr[start1++]; } while(start2 < end2) { result[low++] = arr[start2++]; } } int[] temp = arr; arr = result; result = temp; } result = arr; } ------------------ 这个程式看起来应该是使用 bottom-up 来实作 但是他有几个地方我有点疑问 1. for(block = 1; block < len*2; block *= 2) 我觉得 block < len 好像就可以了 ? 2. int mid = (start + block) < len ? (start + block) : len; mid 只有在只剩单一元素时才会 >= len,但是只剩单一元素也不需做比较 所以好像不需要判断 ? 3. int[] temp = arr; arr = result; result = temp; 一开始我想就是把结果存回去,用 for (int i = 0; i < arr.length; i++) { arr[i] = result[i]; } 但是他却用浅层复制做交换 为何要用浅层复制来做交换 ? 速度会比较快吗 ? -- 肝不好 肝若好 人生是黑白的 考卷是空白的 、 ﹐ ● ●b ▎ ●> ● ▌ ﹍﹍ 囧> 干... ▲ ■┘ ▎ ■ ▋ ︶■ 〈﹀ ∥ ▁▁∥ ▎ ﹀〉▊ 〈\ ψcockroach727 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 71.95.52.50
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1481845143.A.7D3.html
1F:→ ssccg: 3当然比较快啊,每次loop少copy整个array一次 12/16 09:11
为何要加入交换的步骤, 让 result 和 arr 不是指向相同的参考吗 ? ※ 编辑: obelisk0114 (169.235.208.129), 12/16/2016 09:33:45
2F:→ ssccg: loop里都是从来源arr到目标result,做完一次当然要把来源改 12/16 10:04
3F:→ ssccg: 成指向这轮的结果(arr=result),至於result=temp(arr)只是 12/16 10:05
4F:→ ssccg: 重新利用现有空间而已 12/16 10:06
我把交换指向注解掉,结果会错误 假如只是为了利用现有空间,应该没有问题
5F:→ ssccg: 另外这不是浅层复制,根本没有复制,是交换指向的array物件 12/16 10:07
6F:→ ssccg: 1没错到block < len就可 12/16 10:09
7F:→ ssccg: 2 当然还是要判断只是不用多做只剩一个block直接break就好 12/16 10:10
这样 start + break 就会等於 len 应该是不会有大於 len 的情形吧 ※ 编辑: obelisk0114 (169.235.208.129), 12/16/2016 10:43:14
8F:→ ssccg: 当然会错误啊,不利用现有空间不是不用做事 12/16 10:47
9F:→ ssccg: 是要像一开始那样result = new int[len]; 12/16 10:47
10F:→ ssccg: 然後你的等於大於len我看不懂你是要说什麽... 12/16 10:56
11F:→ ssccg: 我是说start + block < len这判断一定要做,当这条件不成立 12/16 10:58
12F:→ ssccg: (start + block >= len)时,代表这轮的两个block中後面那个 12/16 11:00
13F:→ ssccg: 没有了,只有一个block,至於是>还是=是差在前面那个block 12/16 11:00
14F:→ ssccg: 大小是不是刚好等於这轮的block,跟要不要这判断没关系 12/16 11:01
int mid = (start + block) < len ? (start + block) : len; 是不是只需要写成这样就好 ? int mid = start + block 会出现 mid 大於 len 的情形吗 ? ※ 编辑: obelisk0114 (169.235.208.129), 12/16/2016 11:06:21
15F:→ ssccg: 举例来说block = 2, start = 4, len = 5 12/16 13:14
16F:→ ssccg: 至少要加 if (mid >= len) break; 12/16 13:14
17F:→ obelisk0114: 了解了, Thanks 12/16 19:02







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Boy-Girl站内搜寻

TOP