国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 歸并排序的原理及java代碼實現

歸并排序的原理及java代碼實現

2020-03-26 13:56hebedich JAVA教程

歸并(Merge)排序法是將兩個(或兩個以上)有序表合并成一個新的有序表,即把待排序序列分為若干個子序列,每個子序列是有序的。然后再把有序子序列合并為整體有序序列。遞歸形式的算法在形式上較簡潔,但實用性很差。一

概述

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

歸并排序采用的是遞歸來實現,屬于“分而治之”,將目標數組從中間一分為二,之后分別對這兩個數組進行排序,排序完畢之后再將排好序的兩個數組“歸并”到一起,歸并排序最重要的也就是這個“歸并”的過程,歸并的過程中需要額外的跟需要歸并的兩個數組長度一致的空間。

效果圖:

歸并排序的原理及java代碼實現

步驟

申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合并后的序列
設定兩個指針,最初位置分別為兩個已經排序序列的起始位置
比較兩個指針所指向的元素,選擇相對小的元素放入到合并空間,并移動指針到下一位置
重復步驟3直到某一指針達到序列尾
將另一序列剩下的所有元素直接復制到合并序列尾
實例

原始數據:

3 5 2 6 2
歸并的前提是將數組分開,一分為二,再一分為二,分到不能再分,進行歸并。

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

?
1
[3 5 2] [6 2]

第二輪分隔,對[3 5 2]進行分隔

?
1
[3 5] [2] [6 2]

第三輪分隔,對[3 5]進行分隔

?
1
[3] [5] [2] [6 2]

合并[3] [5]

?
1
[3 5] [2] [6 2]

合并[3 5] [2]

?
1
[2 3 5] [6 2]

第四輪分隔,對[6 2]進行分隔

?
1
[2 3 5] [6] [2]

合并[6] [2]

?
1
[2 3 5] [2 6]

合并[2 3 5] [2 6]

?
1
[2 2 3 5 6]

代碼實現(Java)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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("正在進行第" + mark + "次分隔,得到");
      System.out.println("[" + low + "-" + mid + "] [" + (mid + 1) + "-" + high + "]");
      // 左邊數組
      sort(array, low, mid);
      // 右邊數組
      sort(array, mid + 1, high);
      // 左右歸并
      merge(array, low, mid, high);
    }
    return array;
  }
 
  /**
   * 對數組進行歸并
   *
   * @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;
    // 把較小的數先移到新數組中
    while (i <= mid && j <= high) {
      if (array[i] < array[j]) {
        temp[k++] = array[i++];
      } else {
        temp[k++] = array[j++];
      }
    }
    // 兩個數組之一可能存在剩余的元素
    // 把左邊剩余的數移入數組
    while (i <= mid) {
      temp[k++] = array[i++];
    }
    // 把右邊邊剩余的數移入數組
    while (j <= high) {
      temp[k++] = array[j++];
    }
    // 把新數組中的數覆蓋array數組
    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("最終結果");
    for (int i : sorted) {
      System.out.print(i + " ");
    }
  }
}

測試輸出結果:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
正在進行第1次分隔,得到
[0-2] [3-4]
正在進行第2次分隔,得到
[0-1] [2-2]
正在進行第3次分隔,得到
[0-0] [1-1]
合并:[0-0] 和 [1-1]
合并:[0-1] 和 [2-2]
正在進行第4次分隔,得到
[3-3] [4-4]
合并:[3-3] 和 [4-4]
合并:[0-2] 和 [3-4]
最終結果
2 2 3 5 6

經測試,與實例中結果一致。

延伸 · 閱讀

精彩推薦
  • JAVA教程java實現系統托盤示例

    java實現系統托盤示例

    桌面的系統托盤即當程序最小化或者關閉按鈕程序并沒有退出,而是最小化在任務狀態區域,下面是使用java實現系統托盤示例 ...

    java教程網1402019-11-13
  • JAVA教程java解析sina視頻

    java解析sina視頻

    本文介紹了一個java解析sina視頻地址的例子,從這個例子中可以學習到java使用sax解析xml的方法,大家可以參考修改成其它功能 ...

    java教程網2282019-10-30
  • JAVA教程javascript身份證驗證代碼

    javascript身份證驗證代碼

    對于客戶端驗證用戶輸入的身份證是否符合格式的代碼,需要的朋友可以參考下。 ...

    java教程網3182019-11-11
  • JAVA教程java連接Mysql數據庫的工具類

    java連接Mysql數據庫的工具類

    這篇文章主要介紹了java連接Mysql數據庫的工具類,非常的實用,推薦給大家,需要的朋友可以參考下 ...

    hebedich4872019-12-12
  • JAVA教程Netty + ZooKeeper 實現簡單的服務注冊與發現

    Netty + ZooKeeper 實現簡單的服務注冊與發現

    服務注冊和發現一直是分布式的核心組件。本文介紹了借助 ZooKeeper 做注冊中心,如何實現一個簡單的服務注冊和發現。,需要的朋友可以參考下...

    fengzhizi7152982019-07-08
  • JAVA教程java中break和continue區別及使用場合分析

    java中break和continue區別及使用場合分析

    本文力圖通過實例加使用場合詳解來引導菜鳥重新認識break和continue語句,需要的朋友可以參考下 ...

    java教程網3362019-11-03
  • JAVA教程java實現遞歸文件列表的方法

    java實現遞歸文件列表的方法

    這篇文章主要介紹了java實現遞歸文件列表的方法,實例分析了java采用遞歸算法遍歷文件的技巧,具有一定參考借鑒價值,需要的朋友可以參考下 ...

    華宰1412019-12-27
  • JAVA教程Java SwingWorkder使用實例

    Java SwingWorkder使用實例

    最近在學習Swing,我們都知道在UI表現線程里面長時間執行操作時,畫面會假死,為了能夠讓費時操作不影響畫面表現,就需要用多線程了 ...

    Java教程網2822019-11-20
主站蜘蛛池模板: 午夜黄色| 九九资源站 | 日韩精品一区二区三区中文在线 | 在线天堂v | 成人免费视频 | 精品福利一区二区三区 | 动漫泳衣美女 | 精品一区二区三区免费 | 中文字幕国产一区 | 精品国产一区二区三区免费 | 日韩在线观看中文字幕 | 欧美亚洲一区 | 性色综合 | 国产一区在线免费观看 | 激情五月婷婷综合 | 欧美三级在线播放 | 久久mm| 欧美精品日韩 | 在线视频 中文字幕 | 欧美大片免费高清观看 | 欧美日韩日本国产 | 国产日韩欧美一二三区 | 日韩视频精品 | 久热在线| 成人羞羞网站 | 精品一区二区三区蜜桃 | 欧美成人精品一区二区三区 | 国产亚洲一区二区精品 | 五月天婷婷综合 | 久久久精品亚洲 | 午夜影院a | 91精品一区 | 精品国产黄a∨片高清在线 黄色大片aaaa | 免费嗨片网 | 精品一区av | 91免费版在线观看 | 欧美性猛交一区二区三区精品 | 一区二区欧美在线 | 日韩欧美在线观看 | 国产精品成人在线视频 | 久久久久久久av |