最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

歸并排序的原理及java代碼實(shí)現(xiàn)

 更新時(shí)間:2016年02月02日 10:54:33   投稿:hebedich  
歸并(Merge)排序法是將兩個(gè)(或兩個(gè)以上)有序表合并成一個(gè)新的有序表,即把待排序序列分為若干個(gè)子序列,每個(gè)子序列是有序的。然后再把有序子序列合并為整體有序序列。遞歸形式的算法在形式上較簡(jiǎn)潔,但實(shí)用性很差。一般情況下,很少利用二路歸并排序法進(jìn)行內(nèi)部排序。

概述

歸并(Merge)排序法是將兩個(gè)(或兩個(gè)以上)有序表合并成一個(gè)新的有序表,即把待排序序列分為若干個(gè)子序列,每個(gè)子序列是有序的。然后再把有序子序列合并為整體有序序列。

歸并排序采用的是遞歸來(lái)實(shí)現(xiàn),屬于“分而治之”,將目標(biāo)數(shù)組從中間一分為二,之后分別對(duì)這兩個(gè)數(shù)組進(jìn)行排序,排序完畢之后再將排好序的兩個(gè)數(shù)組“歸并”到一起,歸并排序最重要的也就是這個(gè)“歸并”的過(guò)程,歸并的過(guò)程中需要額外的跟需要?dú)w并的兩個(gè)數(shù)組長(zhǎng)度一致的空間。

效果圖:

步驟

申請(qǐng)空間,使其大小為兩個(gè)已經(jīng)排序序列之和,該空間用來(lái)存放合并后的序列
設(shè)定兩個(gè)指針,最初位置分別為兩個(gè)已經(jīng)排序序列的起始位置
比較兩個(gè)指針?biāo)赶虻脑兀x擇相對(duì)小的元素放入到合并空間,并移動(dòng)指針到下一位置
重復(fù)步驟3直到某一指針達(dá)到序列尾
將另一序列剩下的所有元素直接復(fù)制到合并序列尾
實(shí)例

原始數(shù)據(jù):

3 5 2 6 2
歸并的前提是將數(shù)組分開(kāi),一分為二,再一分為二,分到不能再分,進(jìn)行歸并。

第一輪分隔,索引2 ((0+4)/2=2) 為中間

[3 5 2] [6 2]

第二輪分隔,對(duì)[3 5 2]進(jìn)行分隔

[3 5] [2] [6 2]

第三輪分隔,對(duì)[3 5]進(jìn)行分隔

[3] [5] [2] [6 2]

合并[3] [5]

[3 5] [2] [6 2]

合并[3 5] [2]

[2 3 5] [6 2]

第四輪分隔,對(duì)[6 2]進(jìn)行分隔

[2 3 5] [6] [2]

合并[6] [2]

[2 3 5] [2 6]

合并[2 3 5] [2 6]

[2 2 3 5 6]

代碼實(shí)現(xiàn)(Java)

package com.coder4j.main.arithmetic.sorting;

public class Merge {
  
  private static int mark = 0;

  /**
   * 歸并排序
   * 
   * @param array
   * @param low
   * @param high
   * @return
   */
  private static int[] sort(int[] array, int low, int high) {
    int mid = (low + high) / 2;
    if (low < high) {
      mark++;
      System.out.println("正在進(jìn)行第" + mark + "次分隔,得到");
      System.out.println("[" + low + "-" + mid + "] [" + (mid + 1) + "-" + high + "]");
      // 左邊數(shù)組
      sort(array, low, mid);
      // 右邊數(shù)組
      sort(array, mid + 1, high);
      // 左右歸并
      merge(array, low, mid, high);
    }
    return array;
  }

  /**
   * 對(duì)數(shù)組進(jìn)行歸并
   * 
   * @param array
   * @param low
   * @param mid
   * @param high
   */
  private static void merge(int[] array, int low, int mid, int high) {
    System.out.println("合并:[" + low + "-" + mid + "] 和 [" + (mid + 1) + "-" + high + "]");
    int[] temp = new int[high - low + 1];
    int i = low;// 左指針
    int j = mid + 1;// 右指針
    int k = 0;
    // 把較小的數(shù)先移到新數(shù)組中
    while (i <= mid && j <= high) {
      if (array[i] < array[j]) {
        temp[k++] = array[i++];
      } else {
        temp[k++] = array[j++];
      }
    }
    // 兩個(gè)數(shù)組之一可能存在剩余的元素
    // 把左邊剩余的數(shù)移入數(shù)組
    while (i <= mid) {
      temp[k++] = array[i++];
    }
    // 把右邊邊剩余的數(shù)移入數(shù)組
    while (j <= high) {
      temp[k++] = array[j++];
    }
    // 把新數(shù)組中的數(shù)覆蓋array數(shù)組
    for (int m = 0; m < temp.length; m++) {
      array[m + low] = temp[m];
    }
  }

  /**
   * 歸并排序
   * 
   * @param array
   * @return
   */
  public static int[] sort(int[] array) {
    return sort(array, 0, array.length - 1);
  }

  public static void main(String[] args) {
    int[] array = { 3, 5, 2, 6, 2 };
    int[] sorted = sort(array);
    System.out.println("最終結(jié)果");
    for (int i : sorted) {
      System.out.print(i + " ");
    }
  }
}

測(cè)試輸出結(jié)果:

正在進(jìn)行第1次分隔,得到
[0-2] [3-4]
正在進(jìn)行第2次分隔,得到
[0-1] [2-2]
正在進(jìn)行第3次分隔,得到
[0-0] [1-1]
合并:[0-0] 和 [1-1]
合并:[0-1] 和 [2-2]
正在進(jìn)行第4次分隔,得到
[3-3] [4-4]
合并:[3-3] 和 [4-4]
合并:[0-2] 和 [3-4]
最終結(jié)果
2 2 3 5 6 

經(jīng)測(cè)試,與實(shí)例中結(jié)果一致。

相關(guān)文章

  • 淺談Java8新特性Predicate接口

    淺談Java8新特性Predicate接口

    這篇文章主要介紹了淺談Java8新特性Predicate接口,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • 在mybatis中如何將Map作為參數(shù)

    在mybatis中如何將Map作為參數(shù)

    這篇文章主要介紹了在mybatis中如何將Map作為參數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 詳解Spring Boot 定時(shí)任務(wù)的實(shí)現(xiàn)方法

    詳解Spring Boot 定時(shí)任務(wù)的實(shí)現(xiàn)方法

    最近在用SpringBoot寫(xiě)一個(gè)關(guān)于定時(shí)項(xiàng)目的時(shí)候遇到一個(gè)問(wèn)題,下面小編把如何處理定時(shí)任務(wù)的解決思路分享給大家 ,需要的朋友參考下
    2017-05-05
  • Spring Data JPA中的動(dòng)態(tài)查詢實(shí)例

    Spring Data JPA中的動(dòng)態(tài)查詢實(shí)例

    本篇文章主要介紹了詳解Spring Data JPA中的動(dòng)態(tài)查詢。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • SpringBoot使用Druid數(shù)據(jù)源的配置方法

    SpringBoot使用Druid數(shù)據(jù)源的配置方法

    這篇文章主要介紹了SpringBoot使用Druid數(shù)據(jù)源的配置方法,文中代碼實(shí)例相結(jié)合的形式給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2018-04-04
  • IDEA 中使用 Big Data Tools 連接大數(shù)據(jù)組件

    IDEA 中使用 Big Data Tools 連接大數(shù)據(jù)組件

    本文主要介紹了IDEA 中使用 Big Data Tools 連接大數(shù)據(jù)組件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 使用eclipse + maven一步步搭建SSM框架教程詳解

    使用eclipse + maven一步步搭建SSM框架教程詳解

    SSM(Spring+SpringMVC+MyBatis)框架集由Spring、SpringMVC、MyBatis三個(gè)開(kāi)源框架整合而成,常作為數(shù)據(jù)源較簡(jiǎn)單的web項(xiàng)目的框架.這篇文章主要介紹了eclipse + maven搭建SSM框架 ,需要的朋友可以參考下
    2017-11-11
  • Spring加載properties文件的方法

    Spring加載properties文件的方法

    這篇文章主要為大家詳細(xì)介紹了Spring加載properties文件的兩種方法,一是通過(guò)xml方式,另一種方式是通過(guò)注解方式,感興趣的小伙伴們可以參考一下
    2016-06-06
  • SpringMVC JSON數(shù)據(jù)交互及RESTful支持實(shí)現(xiàn)方法

    SpringMVC JSON數(shù)據(jù)交互及RESTful支持實(shí)現(xiàn)方法

    這篇文章主要介紹了SpringMVC JSON數(shù)據(jù)交互及RESTful支持實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • java使用ffmpeg實(shí)現(xiàn)上傳視頻的轉(zhuǎn)碼提取視頻的截圖等功能(代碼操作)

    java使用ffmpeg實(shí)現(xiàn)上傳視頻的轉(zhuǎn)碼提取視頻的截圖等功能(代碼操作)

    這篇文章主要介紹了java使用ffmpeg實(shí)現(xiàn)上傳視頻的轉(zhuǎn)碼,提取視頻的截圖等功能,本文圖文并茂給大家介紹的非常詳細(xì),對(duì)大家的工作或?qū)W習(xí)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03

最新評(píng)論

泽库县| 通江县| 万山特区| 乌拉特后旗| 扎赉特旗| 佛冈县| 烟台市| 鹤峰县| 方正县| 沙坪坝区| 黄骅市| 长丰县| 溆浦县| 万州区| 阿鲁科尔沁旗| 宁陵县| 临安市| 司法| 西宁市| 隆尧县| 桦甸市| 凤冈县| 绩溪县| 霍林郭勒市| 常州市| 江阴市| 巴彦县| 甘洛县| 颍上县| 宜宾县| 闵行区| 综艺| 兴国县| 华池县| 高要市| 金乡县| 焉耆| 太仓市| 南城县| 榆林市| 乌审旗|