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/m.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燈, 水草

請輸入看板名稱,例如:BabyMother站內搜尋

TOP