多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > php教程 > Java與算法之(11) - 合并排序

Java與算法之(11) - 合并排序

來源:程序員人生   發(fā)布時間:2016-11-17 09:08:15 閱讀次數(shù):2844次

天下事,合久必分,分久必合。合并排序的基本思想正是先分再合。

例如對3, 1這個數(shù)列排序,首先是分,分為3和1兩個數(shù)列,然后再合并并排序。合并需要額外的輔助空間,即建立1個兩個數(shù)列長度之和的空數(shù)組用于存儲合并結(jié)果。

合并分為3步:

1)兩個數(shù)列在起始位置各分配1個"指針",對照指針位置的數(shù)字,取較小的數(shù)字存入輔助數(shù)組。數(shù)字被移出的1側(cè),指針右移1格,再次比較兩個指針位置的數(shù)字,直到某1側(cè)的指針移出數(shù)組之外結(jié)束。

2)把左邊數(shù)組剩余的數(shù)字按順序移動到輔助數(shù)組中

3)把右邊數(shù)組剩余的數(shù)字按順序移動到輔助數(shù)組中

進(jìn)程以下圖:


下面把兩個數(shù)組的長度都增加到2,再看1下合并進(jìn)程:


視察1下這個流程可以看出,這類合并排序的條件是左右兩個數(shù)列本身是有序的。所以如果對4, 2,  3, 1排序,拆成4, 2和3, 1兩個數(shù)列明顯是不行的,需要繼續(xù)拆分4, 2為4和2,然后合并為2, 4;拆分右邊為3, 1,然后合并成1, 3。最后合并2, 4和1, 3。

以4, 3, 6, 2, 7, 1, 5為例,完全的排序進(jìn)程以下圖:


來看代碼:

import java.util.Arrays; /** * 合并排序法 * Created by autfish on 2016/9/20. */ public class MergeSort { public static void main(String[] args) { int[] numbers = new int[] {4, 3, 6, 2, 7, 1, 5}; System.out.println("排序前: " + Arrays.toString(numbers)); MergeSort ms = new MergeSort(); ms.sort(numbers, 0, numbers.length - 1); System.out.println("排序后: " + Arrays.toString(numbers)); } public void sort(int[] numbers, int from, int to) { int middle = (from + to) / 2; if (from < to) { sort(numbers, from, middle); sort(numbers, middle + 1, to); //左邊數(shù)列最大值小于右邊數(shù)列最小值, 不需要通過合并來調(diào)劑順序 if(numbers[middle] < numbers[middle + 1]) return; merge(numbers, from, middle, to); } } private void merge(int[] numbers, int from, int middle, int to) { int[] temp = new int[to - from + 1]; int left = from; int right = middle + 1; int i = 0; //從拆分到兩邊數(shù)列各剩1個數(shù)字開始合并; 當(dāng)數(shù)列中有多個數(shù)字時, 1定是已排好序的 //從兩邊數(shù)列左邊開始順次取數(shù)對照, 挑選小的1個放入臨時數(shù)組 while (left <= middle && right <= to) { if (numbers[left] < numbers[right]) { temp[i++] = numbers[left++]; } else { temp[i++] = numbers[right++]; } } //把左側(cè)數(shù)列剩余的數(shù)移入數(shù)組 while (left <= middle) { temp[i++] = numbers[left++]; } //把右側(cè)數(shù)列剩余的數(shù)移入數(shù)組 while (right <= to) { temp[i++] = numbers[right++]; } System.arraycopy(temp, 0, numbers, from, temp.length); } }
運行:

排序前: [4, 3, 6, 2, 7, 1, 5] 排序后: [1, 2, 3, 4, 5, 6, 7]
合并排序平均情況和最壞情況的時間復(fù)雜度都是O(nlogn),由于需要額外的輔助空間,空間復(fù)雜度為O(n)。

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進(jìn)行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 色老头成人免费视频天天综合 | 国产福利在线观看永久免费 | 免费永久国产在线视频 | 午夜影院免费体验 | 亚洲一区www | 欧美性猛交xxxx免费看手交 | 国产精品久久久久久吹潮 | 真实国产精品视频国产网 | 免费一级毛片免费播放 | 亚洲欧美成aⅴ人在线观看 亚洲欧美成人 | 国产成人久久精品 | 欧美极品xxx | 五月天福利视频 | 免费一级欧美片片线观看 | 高清性欧美xxx | 亚洲天堂日韩在线 | 亚洲高清视频免费 | 国产1区精品 | 欧美日韩国产高清一区二区三区 | 亚洲欧美片 | 毛片机地 | 亚洲在线观看免费视频 | 永久在线毛片免费观看 | 国内精品久久久久久不卡影院 | 欧美激情久久久久久久久 | 欧美日韩一区二区在线视频播放 | 老司机午夜精品视频观看 | 成人福利在线 | q欧美性猛交xxxx乱大交 | 9191免费视频观看高清 | 亚洲小说春色综合另类网蜜桃 | 欧美va在线观看 | 亚洲动漫在线观看 | 成人淫片 | 亚洲精品短视频 | 在线v片| 亚洲成a人不卡在线观看 | 国内一级一级毛片a免费 | 日本特一级毛片免费视频 | 成人a级高清视频在线观看 成人a毛片高清视频 | 99精品一区二区三区 |