一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

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

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

服務器之家 - 編程語言 - JAVA教程 - Java編程中實現歸并排序算法的實例教程

Java編程中實現歸并排序算法的實例教程

2020-04-24 12:28然則 JAVA教程

這篇文章主要介紹了Java編程中實現歸并排序算法的實例教程,包括自底向上的歸并排序的實現方法介紹,需要的朋友可以參考下

算法概述/思路
歸并排序是基于一種被稱為“分治”(divide and conquer)的策略。其基本思路是這樣的:
1.對于兩個有序的數組,要將其合并為一個有序數組,我們可以很容易地寫出如下代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//both a and b is ascend.
public void merge(int[] a, int[] b, int[] c){
  int i=0,j=0,k=0;
  while (i<=a.length && j<=b.length){
    if (a[i]<=b[i]){
      c[k++]=a[i++];
    }
    else{
      c[k++]=b[j++];
    }
  }
  while (i<=a.length){
    c[k++]=a[i++];
  }
  while (j<=b.length){
    c[k++]=b[j++];
  }
}

容易看出,這樣的合并算法是高效的,其時間復雜度可達到O(n)。
2.假如有一個無序數組需要排序,但它的兩個完全劃分的子數組A和B分別有序,借助上述代碼,我們也可以很容易實現;
3.那么,如果A,B無序,怎么辦呢?可以把它們再分成更小的數組。
4.如此一直劃分到最小,每個子數組都只有一個元素,則可以視為有序數組。
5.從這些最小的數組開始,逆著上面的步驟合并回去,整個數組就排好了。
總而言之,歸并排序就是使用遞歸,先分解數組為子數組,再合并數組。

例子
下面舉例說明,假如要對數組a={2,1,3,5,2,3}進行排序,那么把數組劃分為{2,1,3}和{5,2,3}兩個子數組,這兩個子數組排序后變為{1,2,3}和{2,3,5},然后對這兩個數組進行歸并操作便得到最終的有序數組。代碼實現如下:

?
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
void sort(int[] a) {
  int[] aux = new int[a.length];  //輔助數組
  mergeSort(a, 0, a.length - 1, aux);
}
 
void mergeSort(int[] a, int lo, int hi, int[] aux) {
  if (hi <= lo)
    return;
  int mid = lo + (hi - lo) / 2;
  mergeSort(a, lo, mid, aux);
  mergeSort(a, mid + 1, hi, aux);
  merge(a, lo, mid, hi, aux);
 
}
 
void merge(int[] a, int lo, int mid, int hi, int[] aux) {
  int i = lo, j = mid + 1;
  for (int k = lo; k <= hi; k++) {
    aux[k] = a[k];
  }
  for (int k = lo; k <= hi; k++) {
    if (i > mid)
      a[k] = aux[j++];
    else if (j > hi)
      a[k] = aux[i++];
    else if (aux[i] <= aux[j])
      a[k] = aux[i++];
    else
      a[k] = aux[j++];
 
  }
}

另一種實現:自底向上的歸并排序
在上面的實現中,相當于將一個大問題分割成小問題分別解決,然后用所有小問題的答案來解決整個大問題。將一個大的數組的排序劃分為小數組的排序是自頂向下的排序。還有一種實現是自底向上的排序,即先兩兩歸并,然后四四歸并......代碼實現如下:

?
1
2
3
4
5
6
7
8
9
10
void sort(int[] a) {
  int N = a.length;
  int[] aux = new int[N];
  for (int sz = 1; sz < N; sz += sz) {
    for (int lo = 0; lo < N - sz; lo += sz + sz) {
      //在每輪歸并中,最后一次歸并的第二個子數組可能比第一個子數組要小
      merge(a, lo, lo + sz - 1, Math.min(lo + sz + sz - 1, N - 1), aux);
    }
  }
}

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩一区二区三区不卡视频 | 无码日韩精品一区二区免费 | 国产精品成人麻豆专区 | 美女舒服好紧太爽了视频 | 国产高清精品自在久久 | 国产亚洲精品91 | 日韩大片免费看 | 久久AV喷吹AV高潮欧美 | 国产在线欧美日韩精品一区二区 | 娇妻在床上迎合男人 | 99热精品成人免费观看 | 午夜一级| 91porny紧身翘臀 | 亚洲国产日韩制服在线观看 | 青青青国产成人久久111网站 | 国产a一级毛片爽爽影院 | 久青草国产在线观看视频 | 亚洲国产精品综合欧美 | 精品国产免费第一区二区三区日韩 | 亚洲女同在线观看 | 大乳孕妇一级毛片 | 精品国产一二三区在线影院 | 国产精品免费精品自在线观看 | 国产成人一区二区三区小说 | 成人在线一区二区 | 8x8x丝袜美女 | aigao视频| 国内精品久久久久影院网站 | 午夜一个人在线观看完整版 | 欧美折磨另类系列sm | 国产麻豆91欧美一区二区 | 国产亚洲精品久久yy5099 | 亚洲spank男男实践网站 | 国产精品午夜剧场 | beeg xxxx日本| 亚洲卡一卡2卡三卡4麻豆 | 国产91对白在线观看 | 猛h辣h高h文湿校园1v1 | 亚洲国产欧美目韩成人综合 | 兽皇videos日本另类 | 猛男深夜狂cao小男生 |