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

Java分治歸并排序算法實(shí)例詳解

 更新時(shí)間:2017年12月12日 12:16:42   作者:小木偶-嗯嗯  
這篇文章主要介紹了Java分治歸并排序算法,結(jié)合實(shí)例形式詳細(xì)分析了分治歸并排序算法的原理及java實(shí)現(xiàn)技巧,需要的朋友可以參考下

本文實(shí)例講述了Java分治歸并排序算法。分享給大家供大家參考,具體如下:

1、分治法

許多有用的算法在結(jié)構(gòu)上是遞歸的:為了解決一個(gè)給定的問題,算法一次或多次遞歸地調(diào)用其自身以解決緊密相關(guān)的若干子問題。這些算法典型地遵循分治法的思想:將原問題分解為幾個(gè)規(guī)模較小但類似于原問題的子問題,遞歸地求解這些子問題,然后再合并這些子問題的解來建立原問題的解。

分治模式在每層遞歸時(shí)都有三個(gè)步驟:

(1)分解原問題為若干子問題,這些子問題是原問題的規(guī)模較小的實(shí)例。
(2)解決這些子問題,遞歸地求解各子問題。然而,若子問題的規(guī)模足夠小,則直接求解。
(3)合并這些子問題的解成原問題的解。

2、歸并排序算法

歸并排序算法完全遵循分治模式。直觀上其操作如下:

(1)分解:分解待排序的n個(gè)元素的序列成各具n/2個(gè)元素的兩個(gè)子序列。
(2)解決:使用歸并排序遞歸地排序兩個(gè)子序列。
(3)合并:合并兩個(gè)已排序的子序列以產(chǎn)生已排序的答案。

當(dāng)待排序的序列長度為1時(shí),遞歸“開始回升”,在這種情況下不要做任何工作,因?yàn)殚L度為1的每個(gè)序列都已排好序。歸并排序算法的關(guān)鍵操作是“合并”步驟中兩個(gè)已排序序列的合并。我們通過調(diào)用一個(gè)輔助過程Merge(A,p,q,r)來完成合并,其中A是一個(gè)數(shù)組,p、q和r是數(shù)組下標(biāo),滿足p<=q<r。該過程假設(shè)子數(shù)組A[p,q]和A[q+1,r]都已排好序。它合并這兩個(gè)子數(shù)組形成單一的已排好序的子數(shù)組并代替當(dāng)前的子數(shù)組A[p,r]。

過程Merge按以下方式工作?;氐轿覀兺鎿淇伺频睦?,假設(shè)桌上有兩堆牌面朝上的牌,每堆都已排序,最小的牌在頂上。我們希望把這兩堆牌合并成單一的排好序的輸出堆,牌面朝下地放在桌上。我們的基本步驟包括在牌面朝上的兩堆牌的頂上兩張牌中選取較小的一張,將該牌從其堆中移開(該堆的頂上將顯露一張新牌)并牌面朝下地將該牌放置到輸出堆。

下面是Merge的偽代碼:

Merge(A,p,q,r):

tmp[1,..,r-p+1]
i = p
j = q+1
while i <= q && j <= r
  if A[i] <= A[j]
  tmp[k++] = A[i++];
  else
  tmp[k++] = A[j++];
  while i <= q
  tmp[k++] = A[i++];
  while j <= r
  tmp[k++] = A[j++];
  for k2 = 0 to tmp.length
  A[k2+p] = tmp[k2];

現(xiàn)在我們可以把過程Merge作為歸并排序算法中的一個(gè)子程序來用。下面的過程Merge_sort(A,p,r)排序子數(shù)組A[p,r]中的元素。若p>=r,則該子數(shù)組最多有一個(gè)元素,所以已經(jīng)排好序。否則,分解步驟簡(jiǎn)單地計(jì)算一個(gè)下標(biāo)q,將A[p,r]分成兩個(gè)子數(shù)組A[p,q]和A[q+1,r],前者包含[n/2]個(gè)元素,后者包含[n/2]個(gè)元素。

Merge_sort(A,p,r):
if p < r
   q = (p+r)/2
   Merge_sort(A,p,q)
   Merge_sort(A,q+1,r)
   Merge(A,p,q,r)

為了排序整個(gè)序列A=(A[0],A[1],...,A[n]),我們執(zhí)行初始調(diào)用Merge_sort(A,0,A.length),這里再次有A.length = n。圖2-4自底向上地說明了當(dāng)n為2的冪時(shí)該過程的操作。算法由以下操作組成:合并只含1項(xiàng)的序列對(duì)形成長度為2的排好序的序列,合并長度為2的序列對(duì)形成長度為4的排好序的序列,依此下去,直到長度為n/2的兩個(gè)序列被合并最終形成長度為n的排好序的序列。

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

public class Merge_sort_test {
  public static void Merge(int[] A,int p,int q,int r){
    int[] tmp = new int[r-p+1];//聲明一個(gè)臨時(shí)數(shù)組,長度為要?dú)w并數(shù)組的長度
    int i = p;  //記住左邊數(shù)組第一個(gè)元素的下標(biāo)
    int j = q+1; //記住右邊數(shù)組第一個(gè)元素的下標(biāo)
    int k = 0;
    while(i <= q && j <= r){
      //左邊數(shù)組元素和右邊數(shù)組元素比較,把小的元素賦給臨時(shí)數(shù)組
      if(A[i] <= A[j]){
        tmp[k++] = A[i++];
      }
      else{
        tmp[k++] = A[j++];
      }
    }
    //把左邊剩余的數(shù)組元素賦給臨時(shí)數(shù)組
    while(i <= q){
      tmp[k++] = A[i++];
    }
    //把右邊剩余的數(shù)組元素賦給臨時(shí)數(shù)組
    while(j <= r){
      tmp[k++] = A[j++];
    }
    //用臨時(shí)數(shù)組元素覆蓋原數(shù)組元素
    for(int k2 = 0;k2 < tmp.length;k2++){
      A[k2+p] = tmp[k2];
    }
  }
  public static void/*int[]*/ Merge_sort(int[] A,int p,int r){
    int q = (p+r)/2;
    if(p < r){
      //遞歸調(diào)用
      Merge_sort(A,p,q);
      Merge_sort(A,q + 1,r);
      //歸并排序數(shù)據(jù)元素
      Merge(A,p,q,r);
    }
    //return A;
  }
  public static void main(String[] args) {
    //
    int[] A = {5,2,4,7,1,3,2,6};
    System.out.println("原始數(shù)據(jù): ");
    for(int i = 0;i < A.length;i++){
      System.out.print(A[i] + " ");
    }
    System.out.println();
    Merge_sort(A,0,A.length -1);
    System.out.println("輸出結(jié)果: ");
    for(int i = 0;i < A.length;i++){
      System.out.print(A[i] + " ");
    }
  }
}

PS:這里再為大家推薦一款關(guān)于排序的演示工具供大家參考:

在線動(dòng)畫演示插入/選擇/冒泡/歸并/希爾/快速排序算法過程工具:
http://tools.jb51.net/aideddesign/paixu_ys

更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • python中tkinter實(shí)現(xiàn)GUI程序三個(gè)實(shí)例教程

    python中tkinter實(shí)現(xiàn)GUI程序三個(gè)實(shí)例教程

    Python提供了多個(gè)GUI庫,使開發(fā)人員能夠輕松創(chuàng)建各種交互式界面,這篇文章主要給大家介紹了關(guān)于python中tkinter實(shí)現(xiàn)GUI程序的三個(gè)實(shí)例教程,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • Python?round函數(shù)的基本用法與實(shí)例代碼

    Python?round函數(shù)的基本用法與實(shí)例代碼

    round()函數(shù)是Python中用于對(duì)浮點(diǎn)數(shù)進(jìn)行四舍五入的內(nèi)置函數(shù),這篇文章詳細(xì)介紹了round()函數(shù)的基本用法、參數(shù)詳解、特殊情況處理以及應(yīng)用場(chǎng)景,并提供了豐富的示例代碼,需要的朋友可以參考下
    2024-11-11
  • python 通過pip freeze、dowload打離線包及自動(dòng)安裝的過程詳解(適用于保密的離線環(huán)境

    python 通過pip freeze、dowload打離線包及自動(dòng)安裝的過程詳解(適用于保密的離線環(huán)境

    這篇文章主要介紹了python 通過pip freeze、dowload打離線包及自動(dòng)安裝【適用于保密的離線環(huán)境】,本文通圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • python3使用QQ郵箱發(fā)送郵件

    python3使用QQ郵箱發(fā)送郵件

    這篇文章主要為大家詳細(xì)介紹了python3使用QQ郵箱發(fā)郵件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Python創(chuàng)建多線程的兩種常用方法總結(jié)

    Python創(chuàng)建多線程的兩種常用方法總結(jié)

    這篇文章主要為大家詳細(xì)介紹了Python中創(chuàng)建多線程的兩種常用方法,文中的示例代碼簡(jiǎn)潔易懂,對(duì)我們掌握Python有一定的幫助,需要的可以收藏一下
    2023-05-05
  • Python實(shí)現(xiàn)二分法查找及優(yōu)化的示例詳解

    Python實(shí)現(xiàn)二分法查找及優(yōu)化的示例詳解

    二分查找法(Binary?Search)是一種在有序數(shù)組中查找某一特定元素的算法,在本文中,我們將使用?Python?實(shí)現(xiàn)二分查找算法,并深入探討算法的原理和實(shí)現(xiàn)細(xì)節(jié),感興趣的可以了解一下
    2023-04-04
  • Python requests模塊實(shí)例用法

    Python requests模塊實(shí)例用法

    在本篇文章中小編給大家分享了關(guān)于Python requests模塊實(shí)例用法,有需要的朋友們學(xué)習(xí)參考下。
    2019-02-02
  • 解決torch.to(device)是否賦值的坑

    解決torch.to(device)是否賦值的坑

    這篇文章主要介紹了解決torch.to(device)是否賦值的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • pandas數(shù)據(jù)探索之合并數(shù)據(jù)示例詳解

    pandas數(shù)據(jù)探索之合并數(shù)據(jù)示例詳解

    這篇文章主要為大家介紹了pandas數(shù)據(jù)探索之合并數(shù)據(jù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • 淺談python 中類屬性共享的問題

    淺談python 中類屬性共享的問題

    今天小編就為大家分享一篇淺談python 中類屬性共享的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07

最新評(píng)論

锡林郭勒盟| 福贡县| 招远市| 德惠市| 前郭尔| 会宁县| 灵川县| 博野县| 遂昌县| 盐源县| 浦城县| 宜都市| 开江县| 甘肃省| 台安县| 奉新县| 武隆县| 江口县| 深圳市| 九龙坡区| 白沙| 财经| 育儿| 会宁县| 富源县| 桂东县| 全南县| 新巴尔虎右旗| 富平县| 大关县| 屯昌县| 弥勒县| 威海市| 大名县| 梅州市| 古田县| 安溪县| 霍城县| 通海县| 灯塔市| 凌云县|