精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

死磕歸并排序算法

開發 前端 算法
要將一個數組排序,可以先將數組分為兩個數組分別排序,然后再將結果歸并在一起,重復遞歸這個過程,直到數組整體有序,這就是歸并排序的算法思路。

本文轉載自微信公眾號「貝塔學JAVA」,作者Silently9527 。轉載本文請聯系貝塔學JAVA公眾號。

前言

本篇我們談一種基于歸并操作完成排序的算法。

歸并排序算法思路

要將一個數組排序,可以先將數組分為兩個數組分別排序,然后再將結果歸并在一起,重復遞歸這個過程,直到數組整體有序,這就是歸并排序的算法思路。

歸并排序的優點是它能夠保證任意長度為N的數組排序所需的時間與 NlogN 成正比,這個優點是初級排序無法達到的。

缺點是因為歸并操作需要引入額外的數組,額外的空間與N成正比

原地歸并實現

在實現歸并排序之前,我們需要先完成兩個有序數組的歸并操作,即將兩個有序的數組合并成一個有序的數組;

  • 在此過程中我們需要引入一個輔助數組;
  • 定義的方法簽名為merge(a, lo, mid, hi),這個方法將數組a[lo..mid]與a[mid..hi]歸并成一個有序的數組,結果存放到a[lo..mid]中;
  • 該方法中需要使用的上一篇中的公共函數 less ,參考上一篇文章《常見的初級排序算法,這次全搞懂》
  1. public class MergeSort implements SortTemplate { 
  2.     private Comparable[] aux; 
  3.  
  4.     @Override 
  5.     public void sort(Comparable[] array) { 
  6.         //待實現 
  7.     } 
  8.  
  9.     private void merge(Comparable[] a, int lo, int mid, int hi) { 
  10.         for (int i = lo; i <= hi; i++) { 
  11.             aux[i] = a[i]; 
  12.         } 
  13.         int i = lo, j = mid + 1; 
  14.         for (int k = lo; k <= hi; k++) { 
  15.             if (i > mid) { 
  16.                 a[k] = aux[j++]; 
  17.             } else if (j > hi) { 
  18.                 a[k] = aux[i++]; 
  19.             } else if (less(aux[i], aux[j])) { 
  20.                 a[k] = aux[i++]; 
  21.             } else { 
  22.                 a[k] = aux[j++]; 
  23.             } 
  24.         } 
  25.     } 
  26.  

自頂向下的歸并排序

基于分而治之的思想,大的數組排序,先遞歸拆分成小的數組,保證小的數組有序再歸并,直到整個數組有序,這個操作就是自頂向下的歸并排序

  1. public class MergeSort implements SortTemplate { 
  2.     private Comparable[] aux; 
  3.  
  4.     @Override 
  5.     public void sort(Comparable[] array) { 
  6.         aux = new Comparable[array.length]; 
  7.         doSort(array, 0, array.length - 1); 
  8.     } 
  9.  
  10.     private void doSort(Comparable[] array, int lo, int hi) { 
  11.         if (lo >= hi) { 
  12.             return
  13.         } 
  14.         int mid = (hi - lo) / 2 + lo; 
  15.         doSort(array, lo, mid); 
  16.         doSort(array, mid + 1, hi); 
  17.         merge(array, lo, mid, hi); 
  18.     } 
  19.  
  20.     private void merge(Comparable[] a, int lo, int mid, int hi) { 
  21.         //省略 
  22.     } 
  23.  

以上代碼是標準的遞歸歸并排序操作,但是經過仔細思考之后,該算法還有可以優化的地方

「測試數組是否已經有序」;如果a[mid]<=a[mid+1],那么我們就可以跳過merge方法,減少merge操作;修復之后的doSort方法

  1. private void doSort(Comparable[] array, int lo, int hi) { 
  2.     if (lo >= hi) { 
  3.         return
  4.     } 
  5.     int mid = (hi - lo) / 2 + lo; 
  6.     doSort(array, lo, mid); 
  7.     doSort(array, mid + 1, hi); 
  8.     if (array[mid].compareTo(array[mid + 1]) >= 0) { 
  9.         merge(array, lo, mid, hi); 
  10.     } 

「對于小規模的數組可以是用插入排序」;對于小規模的數組使用歸并排序會增加遞歸調用棧,所以我們可以考慮使用插入排序來處理子數組的排序

  1. private void doSort(Comparable[] array, int lo, int hi) { 
  2.     if (lo >= hi) { 
  3.         return
  4.     } 
  5.  
  6.     if (hi - lo < 5) { //測試,小于5就使用插入排序 
  7.         insertionSort(array, lo, hi); 
  8.         return
  9.     } 
  10.  
  11.     int mid = (hi - lo) / 2 + lo; 
  12.     doSort(array, lo, mid); 
  13.     doSort(array, mid + 1, hi); 
  14.     if (less(array[mid + 1], array[mid])) { 
  15.         merge(array, lo, mid, hi); 
  16.     } 
  17.  
  18. //插入排序 
  19. private void insertionSort(Comparable[] array, int lo, int hi) { 
  20.     for (int i = lo; i <= hi; i++) { 
  21.         for (int j = i; j > lo && less(array[j], array[j - 1]); j--) { 
  22.             exch(array, j, j - 1); 
  23.         } 
  24.     } 

「節省復制元素到輔助數組的時間」;要實現該操作較麻煩,需要在每一層遞歸的時候交換輸入數據和輸出數組的角色;修改之后的完整代碼如下:

  1. public class MergeSort implements SortTemplate { 
  2.     private Comparable[] aux; 
  3.  
  4.     @Override 
  5.     public void sort(Comparable[] array) { 
  6.         aux = array.clone(); 
  7.         doSort(aux, array, 0, array.length - 1); 
  8.     } 
  9.  
  10.     private void doSort(Comparable[] src, Comparable[] dest, int lo, int hi) { 
  11.         if (lo >= hi) { 
  12.             return
  13.         } 
  14.  
  15.         if (hi - lo < 5) { //測試,小于5就使用插入排序 
  16.             insertionSort(dest, lo, hi); 
  17.             return
  18.         } 
  19.  
  20.         int mid = (hi - lo) / 2 + lo; 
  21.         doSort(dest, src, lo, mid); 
  22.         doSort(dest, src, mid + 1, hi); 
  23.         if (less(src[mid + 1], src[mid])) { 
  24.             merge(src, dest, lo, mid, hi); 
  25.         } 
  26.     } 
  27.  
  28.     //插入排序 
  29.     private void insertionSort(Comparable[] array, int lo, int hi) { 
  30.         for (int i = lo; i <= hi; i++) { 
  31.             for (int j = i; j > lo && less(array[j], array[j - 1]); j--) { 
  32.                 exch(array, j, j - 1); 
  33.             } 
  34.         } 
  35.     } 
  36.  
  37.     private void merge(Comparable[] src, Comparable[] dest, int lo, int mid, int hi) { 
  38.         int i = lo, j = mid + 1; 
  39.         for (int k = lo; k <= hi; k++) { 
  40.             if (i > mid) { 
  41.                 dest[k] = src[j++]; 
  42.             } else if (j > hi) { 
  43.                 dest[k] = src[i++]; 
  44.             } else if (less(src[i], src[j])) { 
  45.                 dest[k] = src[i++]; 
  46.             } else { 
  47.                 dest[k] = src[j++]; 
  48.             } 
  49.         } 
  50.     } 
  51.  

每一層遞歸操作都會讓子數組有序,但是子數組可能是aux[lo..hi]也有可能是a[lo..hi];由于第一次調用doSort傳入的是src=aux,dest=array,所以遞歸最后的結果一定是輸入到了array中,保證了array整體排序完成

自底向上的歸并排序

實現歸并算法還有另一種思路,就是先歸并哪些小的數組,然后再成對歸并得到子數組,直到整個數組有序

  1. public class MergeSort implements SortTemplate { 
  2.     private Comparable[] aux; 
  3.  
  4.     @Override 
  5.     public void sort(Comparable[] array) { 
  6.         int length = array.length; 
  7.         aux = new Comparable[length]; 
  8.         for (int sz = 1; sz < length; sz += sz) { 
  9.             for (int i = 0; i < length - sz; i += 2 * sz) { 
  10.                 merge(array, i, i + sz - 1, Math.min(i + 2 * sz - 1, length - 1)); 
  11.             } 
  12.         } 
  13.     } 
  14.  
  15.     private void merge(Comparable[] a, int lo, int mid, int hi) { 
  16.         for (int i = lo; i <= hi; i++) { 
  17.             aux[i] = a[i]; 
  18.         } 
  19.         int i = lo, j = mid + 1; 
  20.         for (int k = lo; k <= hi; k++) { 
  21.             if (i > mid) { 
  22.                 a[k] = aux[j++]; 
  23.             } else if (j > hi) { 
  24.                 a[k] = aux[i++]; 
  25.             } else if (less(aux[i], aux[j])) { 
  26.                 a[k] = aux[i++]; 
  27.             } else { 
  28.                 a[k] = aux[j++]; 
  29.             } 
  30.         } 
  31.     } 
  32.  

 

責任編輯:武曉燕 來源: 貝塔學JAVA
相關推薦

2011-04-20 14:29:07

歸并排序

2023-10-09 07:11:03

排序算法序列

2022-04-06 08:58:39

歸并排序Go算法

2021-04-16 09:40:52

Java數據結構算法

2021-01-26 05:33:07

排序算法快速

2022-09-21 08:38:40

歸并排序C++Python

2023-10-09 00:12:55

歸并排序數據

2021-02-04 13:10:32

歸并排序算法

2021-10-12 07:15:02

歸并排序場景

2023-03-08 08:03:09

數據結構算法歸并排序

2020-08-18 08:22:46

歸并排序

2012-12-27 11:11:54

華為任正非

2021-06-03 08:32:18

JVM調優虛擬機

2021-08-04 08:56:34

語言Go排序

2021-06-28 17:26:15

歸并排序建模

2023-04-27 09:13:20

排序算法數據結構

2021-02-25 07:21:00

JVMJavaava虛擬機

2023-12-14 07:36:16

Java并發原子類

2013-06-05 09:38:27

Intel功耗酷睿

2021-06-01 09:29:43

ArthasJVM內存
點贊
收藏

51CTO技術棧公眾號

欧美成人免费在线观看视频| 91精品久久久久久久久| 久久人妻少妇嫩草av无码专区| 青青青国内视频在线观看软件| 高清日韩电视剧大全免费| 欧美日本高清视频| 亚洲蜜桃精久久久久久久久久久久 | 快she精品国产999| www国产亚洲精品久久网站| 极品人妻一区二区| 欧美男体视频| 亚洲欧美国产高清| 精品不卡在线| 五月天婷婷导航| 一区二区三区四区在线观看国产日韩| 亚洲国产精品人人爽夜夜爽| 日日噜噜噜噜久久久精品毛片| av中文字幕在线观看| av在线不卡网| 91精品久久久久久久久久久久久 | 在线观看免费污视频| www欧美xxxx| 国产精品麻豆欧美日韩ww| 高清视频一区二区三区| 成人一二三四区| 国产综合激情| 久久韩国免费视频| 久久av无码精品人妻系列试探| 日本99精品| 欧美怡红院视频| 欧美视频在线免费播放| 国产在线观看a| 国产校园另类小说区| 国内一区在线| 性色av蜜臀av| 久久99国产精品成人| 欧美一级视频免费在线观看| 国产亚洲第一页| 五月婷婷六月综合| 中文字幕欧美日韩在线| 精品无码人妻一区| 老牛国内精品亚洲成av人片| 6080午夜不卡| 日韩av在线综合| 蜜桃视频www网站在线观看| 一区二区三区中文字幕精品精品 | 911久久香蕉国产线看观看| 亚洲无av在线中文字幕| 特级西西人体wwwww| 白嫩白嫩国产精品| 日韩一区二区三区高清免费看看| 午夜免费看视频| 福利一区二区三区视频在线观看| 日韩欧美亚洲成人| www国产黄色| 国产乱码精品一区二三赶尸艳谈| 一区二区三区欧美日韩| www国产免费| 综合图区亚洲| 亚洲视频一区二区在线观看| 日韩人妻精品一区二区三区| 黄色免费在线观看| 亚洲女爱视频在线| 奇米777四色影视在线看| 岛国成人毛片| 亚洲最大成人网4388xx| 蜜臀av性久久久久蜜臀av| 精品国产99久久久久久| 亚洲色图视频网| 91视频成人免费| 性xxxxfjsxxxxx欧美| 亚洲精品乱码久久久久久| 成人在线免费观看网址| 成年人黄视频在线观看| 一区二区三区四区不卡视频| 免费拍拍拍网站| 久久男人av资源站| 色天天综合久久久久综合片| 999精品视频在线| 久久人体av| 欧美成人一区二区三区片免费| 国产成人av片| 亚洲第一论坛sis| 最近2019中文免费高清视频观看www99| 国内毛片毛片毛片毛片毛片| 欧美破处大片在线视频| 97在线观看视频国产| 午夜久久久久久久久久影院| 久久精品国产久精国产| 91福利入口| 三级在线播放| 国产精品久久久久三级| 欧美日韩中文字幕在线播放| 高潮在线视频| 欧美日韩精品专区| 成人欧美精品一区二区| 国产免费久久| 欧美成人精品一区二区三区| 天天综合网久久综合网| 美女视频一区在线观看| 国产伦精品一区二区三区免费视频 | 日韩av影视| 97超碰在线公开在线看免费| 欧美午夜激情视频| 特级西西444www| 奇米影视777在线欧美电影观看| 在线看日韩欧美| 国产成人精品av久久| 青青草视频一区| 国产精品午夜av在线| 在线免费av电影| 亚洲高清久久久| 免费一区二区三区在线观看| 国产精品视屏| 日韩在线高清视频| 毛片视频网站在线观看| 国产一区二区三区久久久 | 污视频软件在线观看| 中文字幕一区二区三区四区不卡| 欧美亚洲日本一区二区三区| 一级欧美视频| 亚洲天堂一区二区三区| 国产精品theporn动漫| 久久成人免费网站| 欧美日本韩国一区二区三区| 日本不卡影院| 91.成人天堂一区| 成人午夜剧场视频网站| 日韩网站在线| 97se国产在线视频| 暖暖日本在线观看| 在线观看欧美日本| 手机av免费看| 亚洲国产二区| 91青青草免费在线看| 色网站免费在线观看| 91九色02白丝porn| 久久久久久久久久久国产精品| 国产一区二区三区四区老人| 91美女片黄在线观看游戏| 成人免费高清在线播放| 色婷婷精品久久二区二区蜜臂av| 三级视频网站在线观看| 欧美日韩一区自拍| 99久久99久久| 亚洲综合影视| 日韩免费一区二区三区在线播放| 91嫩草丨国产丨精品| 九九久久精品视频| 黄频视频在线观看| 伊人久久综合网另类网站| 日韩一区二区久久久| 中文字幕免费播放| 中文字幕精品综合| 天堂网在线免费观看| 日韩精品一区二区久久| 国产精品美女呻吟| 成年人在线观看视频| 精品视频在线视频| 妖精视频在线观看免费 | 亚洲国产精品久久艾草纯爱| 精品1卡二卡三卡四卡老狼| 伊人蜜桃色噜噜激情综合| 国产精品一区视频网站| 高潮在线视频| 国产亚洲欧洲高清一区| 91视频久久久| 中文字幕一区二区三区不卡| 在线播放免费视频| 欧美特黄一区| 久久久婷婷一区二区三区不卡| 欧美黑人疯狂性受xxxxx野外| 亚洲色图偷窥自拍| 91麻豆成人精品国产| 一区二区三区在线影院| 少妇一级淫免费观看| 免费在线亚洲| 亚洲午夜精品一区二区| 人人九九精品视频| 欧美野外猛男的大粗鳮| 在线播放麻豆| 日韩三级电影网址| 国产成人在线播放视频| 国产亚洲va综合人人澡精品 | 在线一区亚洲| 国产一区福利| 国产精品久久99久久| 国产精品剧情一区二区在线观看| 精品福利一区二区三区| 69国产精品视频免费观看| 国产精品麻豆视频| 日批在线观看视频| 日韩福利电影在线| 日本aa在线观看| 欧美美女在线观看| 亚洲a在线观看| 精品国产免费人成网站| 久久视频这里只有精品| 天堂av在线免费| 欧美日韩高清不卡| 久久艹免费视频| 亚洲欧洲国产专区| 99热超碰在线| 久久99国产精品久久99果冻传媒| 国产精品后入内射日本在线观看| 欧美好骚综合网| 久久99热只有频精品91密拍| 99久久99九九99九九九| 日本乱人伦a精品| 日日夜夜天天综合入口| 国产一区二区日韩| 日本黄色一区二区三区| 欧美久久久影院| 日韩毛片一区二区三区| 一区二区三区欧美亚洲| 91麻豆制片厂| 久久亚洲二区三区| 制服.丝袜.亚洲.中文.综合懂| 日本sm残虐另类| 国模无码视频一区二区三区| 亚洲精品tv久久久久久久久久| 奇米视频888战线精品播放| 中文字幕区一区二区三| 91精品视频大全| 欧美韩国亚洲| 欧美一区二区色| 黄页网站大全在线免费观看| 久久影院模特热| wwwxxx在线观看| 亚洲欧美日韩在线高清直播| 天堂av一区二区三区| 欧美精品一区二区精品网| 999免费视频| 欧美日韩国产免费一区二区| 天天操天天干天天摸| 欧美日韩一区二区在线| 亚洲国产精品午夜在线观看| 亚洲欧美日韩在线播放| 又色又爽的视频| 国产欧美精品日韩区二区麻豆天美| 7788色淫网站小说| 成人小视频在线| 国产男女无遮挡猛进猛出| 精品中文av资源站在线观看| 伊人网在线综合| 麻豆久久久久久| 亚洲天堂2018av| 另类小说一区二区三区| 欧美精品性生活| 青青草原综合久久大伊人精品优势| 人妻丰满熟妇av无码区app| 天堂午夜影视日韩欧美一区二区| 亚洲国产精品久久久久婷蜜芽| 国产日韩一区二区三区在线| 国产 日韩 亚洲 欧美| 99精品热6080yy久久| 人体内射精一区二区三区| 亚洲婷婷在线| 精品少妇一区二区三区在线| 国产亚洲激情| 免费黄色特级片| 亚洲综合另类| 熟妇人妻无乱码中文字幕真矢织江| 久久永久免费| 免费看污污网站| 男人的j进女人的j一区| 中文字幕线观看| 国产91精品一区二区麻豆网站| 欧美成人精品一区二区综合免费| 91美女片黄在线观看91美女| 深爱五月激情网| 国产精品短视频| 欧美日韩大片在线观看| 精品国产91久久久| 精品国产乱子伦| 欧美日韩高清一区二区| 亚洲av永久无码国产精品久久 | 成人免费视频| 超在线视频97| 国产在线精彩视频| 国产精品欧美激情在线播放| 95精品视频| 激情伦成人综合小说| 国产精品嫩草影院在线看| 制服国产精品| 亚洲毛片播放| 日韩精品你懂的| 国产精品18久久久久久vr| 亚洲第一黄色网址| 国产精品国产精品国产专区不蜜| 久久久久久久国产视频| 色拍拍在线精品视频8848| 国产精品毛片一区二区在线看舒淇 | 日日碰狠狠添天天爽超碰97| 日韩精品视频网| 一区二区三区人妻| 久久久久久久久久看片| 国产高清视频免费在线观看| 姬川优奈aav一区二区| 中文字幕一区二区三区波野结 | 欧美性xxxx极品hd满灌| 一级黄色小视频| 国产网站欧美日韩免费精品在线观看| 在线看的av网站| 91精品国产色综合久久不卡98口| www.久久| 久久久久综合一区二区三区| 我不卡伦不卡影院| 成人性视频欧美一区二区三区| 国产福利一区二区三区视频在线| 妺妺窝人体色WWW精品| 亚洲最新视频在线观看| 一级片aaaa| 亚洲色图色老头| 日本不卡网站| 国产精品v欧美精品∨日韩| 成人在线一区| 狠狠97人人婷婷五月| 国产盗摄女厕一区二区三区| 欧美日韩中文字幕视频| 日韩欧美高清视频| 好吊视频一二三区| 久久视频在线观看免费| 99久久er| 日韩精品欧美专区| av不卡在线| 97中文字幕在线观看| 成人免费一区二区三区视频| 欧美日韩 一区二区三区| 日韩国产高清视频在线| wwwww亚洲| 成人动漫在线观看视频| 亚洲精品888| 国产精品久久久久久久99| 国产精品天天看| 五月天中文字幕| 亚洲一级黄色av| 欧美中文字幕精在线不卡| 久久久久成人精品免费播放动漫| 一区在线免费观看| 久久久久国产免费| 一区二区三区日本| 精品国产乱码久久久久久蜜臀网站| 日韩亚洲精品电影| 成人在线观看免费播放| 亚洲春色在线视频| 免费观看30秒视频久久| 超碰人人干人人| 欧美日韩精品一区二区三区四区| 成人在线免费视频| 国产精品一区二区久久国产| 成人精品久久| 免费在线观看污网站| 亚洲人一二三区| www日本视频| 久久久久久综合网天天| 精品丝袜久久| 国产a级一级片| 久久久久国产精品麻豆ai换脸| 日韩一级片中文字幕| 尤物九九久久国产精品的特点| 成人国产精品一区二区免费麻豆| 亚洲精品9999| 国内精品伊人久久久久av影院| 高h视频免费观看| 日韩精品最新网址| 182在线播放| 日本一区二区三区免费观看| 蜜臀av一区二区三区| 亚洲xxxx3d动漫| 亚洲成人av片| 另类专区亚洲| 中文字幕欧美日韩一区二区| 国产精品一区二区黑丝| 国产无遮挡又黄又爽在线观看| 亚洲免费影视第一页| 欧美激情不卡| 欧美又粗又长又爽做受| 久久九九久久九九| 国产尤物视频在线观看| 欧美精品videos| 国产欧美日韩| 国产九九九视频| 欧美性猛交99久久久久99按摩| 成人免费黄色网页| 国产91aaa| 热久久国产精品| 久久精品亚洲无码| 亚洲午夜激情免费视频| 嫩呦国产一区二区三区av| 成年人视频观看| 成人欧美一区二区三区小说| 天天干天天爽天天操| 国产精选久久久久久| 亚洲一级一区| 亚洲黄色网址大全| 亚洲国产高清自拍| 日韩成人在线一区| 国产精品秘入口18禁麻豆免会员| 自拍偷在线精品自拍偷无码专区 |