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

Java 歸并排序算法、堆排序算法實(shí)例詳解

 更新時(shí)間:2017年05月05日 14:55:47   投稿:mrr  
這篇文章主要介紹了Java 歸并排序算法、堆排序算法實(shí)例詳解,需要的朋友可以參考下

基本思想:

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

歸并排序示例:

合并方法:

設(shè)r[i…n]由兩個(gè)有序子表r[i…m]和r[m+1…n]組成,兩個(gè)子表長度分別為n-i +1、n-m。

j=m+1;k=i;i=i; //置兩個(gè)子表的起始下標(biāo)及輔助數(shù)組的起始下標(biāo)

若i>m 或j>n,轉(zhuǎn)⑷ //其中一個(gè)子表已合并完,比較選取結(jié)束
//選取r[i]和r[j]較小的存入輔助數(shù)組rf

如果r[i]<r[j],rf[k]=r[i]; i++; k++; 轉(zhuǎn)⑵

否則,rf[k]=r[j]; j++; k++; 轉(zhuǎn)⑵

//將尚未處理完的子表中元素存入rf

如果i<=m,將r[i…m]存入rf[k…n] //前一子表非空

如果j<=n ,  將r[j…n] 存入rf[k…n] //后一子表非空

合并結(jié)束。

算法實(shí)現(xiàn):  

/**
   * 歸并排序
   * 簡(jiǎn)介:將兩個(gè)(或兩個(gè)以上)有序表合并成一個(gè)新的有序表 即把待排序序列分為若干個(gè)子序列,每個(gè)子序列是有序的。然后再把有序子序列合并為整體有序序列
   * 時(shí)間復(fù)雜度為O(nlogn)
   * 穩(wěn)定排序方式
   * @param nums 待排序數(shù)組
   * @return 輸出有序數(shù)組
   */
  public static int[] sort(int[] nums, int low, int high) {
    int mid = (low + high) / 2;
    if (low < high) {
      // 左邊
      sort(nums, low, mid);
      // 右邊
      sort(nums, mid + 1, high);
      // 左右歸并
      merge(nums, low, mid, high);
    }
    return nums;
  }
  /**
   * 將數(shù)組中l(wèi)ow到high位置的數(shù)進(jìn)行排序
   * @param nums 待排序數(shù)組
   * @param low 待排的開始位置
   * @param mid 待排中間位置
   * @param high 待排結(jié)束位置
   */
  public static void merge(int[] nums, int low, int mid, int 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 (nums[i] < nums[j]) {
        temp[k++] = nums[i++];
      } else {
        temp[k++] = nums[j++];
      }
    }
    // 把左邊剩余的數(shù)移入數(shù)組
    while (i <= mid) {
      temp[k++] = nums[i++];
    }
    // 把右邊邊剩余的數(shù)移入數(shù)組
    while (j <= high) {
      temp[k++] = nums[j++];
    }
    // 把新數(shù)組中的數(shù)覆蓋nums數(shù)組
    for (int k2 = 0; k2 < temp.length; k2++) {
      nums[k2 + low] = temp[k2];
    }
  }

二、堆排序算法

1、基本思想:

  堆排序是一種樹形選擇排序,是對(duì)直接選擇排序的有效改進(jìn)。

  堆的定義下:具有n個(gè)元素的序列 (h1,h2,...,hn),當(dāng)且僅當(dāng)滿足(hi>=h2i,hi>=2i+1)或(hi<=h2i,hi<=2i+1) (i=1,2,...,n/2)時(shí)稱之為堆。在這里只討論滿足前者條件的堆。由堆的定義可以看出,堆頂元素(即第一個(gè)元素)必為最大項(xiàng)(大頂堆)。完全二 叉樹可以很直觀地表示堆的結(jié)構(gòu)。堆頂為根,其它為左子樹、右子樹。

  思想:初始時(shí)把要排序的數(shù)的序列看作是一棵順序存儲(chǔ)的二叉樹,調(diào)整它們的存儲(chǔ)序,使之成為一個(gè) 堆,這時(shí)堆的根節(jié)點(diǎn)的數(shù)最大。然后將根節(jié)點(diǎn)與堆的最后一個(gè)節(jié)點(diǎn)交換。然后對(duì)前面(n-1)個(gè)數(shù)重新調(diào)整使之成為堆。依此類推,直到只有兩個(gè)節(jié)點(diǎn)的堆,并對(duì) 它們作交換,最后得到有n個(gè)節(jié)點(diǎn)的有序序列。從算法描述來看,堆排序需要兩個(gè)過程,一是建立堆,二是堆頂與堆的最后一個(gè)元素交換位置。所以堆排序有兩個(gè)函 數(shù)組成。一是建堆的滲透函數(shù),二是反復(fù)調(diào)用滲透函數(shù)實(shí)現(xiàn)排序的函數(shù)。

2、實(shí)例

初始序列:46,79,56,38,40,84

  建堆:

   交換,從堆中踢出最大數(shù)

依次類推:最后堆中剩余的最后兩個(gè)結(jié)點(diǎn)交換,踢出一個(gè),排序完成。

3.算法實(shí)現(xiàn):

public class HeapSort {
  public static void main(String[] args) {
    int[] a={49,38,65,97,76,13,27,49,78,34,12,64};
    int arrayLength=a.length; 
    //循環(huán)建堆 
    for(int i=0;i<arrayLength-1;i++){ 
      //建堆 
      buildMaxHeap(a,arrayLength-1-i); 
      //交換堆頂和最后一個(gè)元素 
      swap(a,0,arrayLength-1-i); 
      System.out.println(Arrays.toString(a)); 
    } 
  }
  //對(duì)data數(shù)組從0到lastIndex建大頂堆
  public static void buildMaxHeap(int[] data, int lastIndex){
     //從lastIndex處節(jié)點(diǎn)(最后一個(gè)節(jié)點(diǎn))的父節(jié)點(diǎn)開始 
    for(int i=(lastIndex-1)/2;i>=0;i--){
      //k保存正在判斷的節(jié)點(diǎn) 
      int k=i;
      //如果當(dāng)前k節(jié)點(diǎn)的子節(jié)點(diǎn)存在 
      while(k*2+1<=lastIndex){
        //k節(jié)點(diǎn)的左子節(jié)點(diǎn)的索引 
        int biggerIndex=2*k+1;
        //如果biggerIndex小于lastIndex,即biggerIndex+1代表的k節(jié)點(diǎn)的右子節(jié)點(diǎn)存在
        if(biggerIndex<lastIndex){ 
          //若果右子節(jié)點(diǎn)的值較大 
          if(data[biggerIndex]<data[biggerIndex+1]){ 
            //biggerIndex總是記錄較大子節(jié)點(diǎn)的索引 
            biggerIndex++; 
          } 
        } 
        //如果k節(jié)點(diǎn)的值小于其較大的子節(jié)點(diǎn)的值 
        if(data[k]<data[biggerIndex]){ 
          //交換他們 
          swap(data,k,biggerIndex); 
          //將biggerIndex賦予k,開始while循環(huán)的下一次循環(huán),重新保證k節(jié)點(diǎn)的值大于其左右子節(jié)點(diǎn)的值 
          k=biggerIndex; 
        }else{ 
          break; 
        } 
      }
    }
  }
  //交換
  private static void swap(int[] data, int i, int j) { 
    int tmp=data[i]; 
    data[i]=data[j]; 
    data[j]=tmp; 
  } 
}

以上所述是小編給大家介紹的Java 歸并排序算法、堆排序算法實(shí)例詳解,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • java防反編譯最簡(jiǎn)單的技巧分享

    java防反編譯最簡(jiǎn)單的技巧分享

    這篇文章主要給大家分享了關(guān)于java防反編譯最簡(jiǎn)單的技巧,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • 解決新版idea新建文件沒有XML和Resource Bundle文件問題

    解決新版idea新建文件沒有XML和Resource Bundle文件問題

    這篇文章主要介紹了解決新版idea新建文件沒有XML和Resource Bundle文件問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Java實(shí)現(xiàn)簡(jiǎn)易畫圖板

    Java實(shí)現(xiàn)簡(jiǎn)易畫圖板

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)易畫圖板,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Arrays.asList方法總結(jié)

    Arrays.asList方法總結(jié)

    本文主要對(duì)Arrays.asList方法進(jìn)行總結(jié)。具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-02-02
  • Mybatis Select Count(*)的返回值類型介紹

    Mybatis Select Count(*)的返回值類型介紹

    這篇文章主要介紹了Mybatis Select Count(*)的返回值類型,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 關(guān)于springboot集成阿里云短信的問題

    關(guān)于springboot集成阿里云短信的問題

    這篇文章主要介紹了springboot集成阿里云短信的方法,本文通過實(shí)例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • Java中的繼承與接口解讀

    Java中的繼承與接口解讀

    這篇文章主要介紹了Java中的繼承與接口使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • java 2d畫圖示例分享(用java畫圖)

    java 2d畫圖示例分享(用java畫圖)

    這篇文章主要介紹了java 2D畫圖示例(用java畫圖),需要的朋友可以參考下
    2014-04-04
  • Java實(shí)現(xiàn)控制臺(tái)輸出兩點(diǎn)間距離

    Java實(shí)現(xiàn)控制臺(tái)輸出兩點(diǎn)間距離

    這篇文章主要介紹了Java實(shí)現(xiàn)控制臺(tái)輸出兩點(diǎn)間距離,涉及了部分編程坐標(biāo)的問題,具有一定參考價(jià)值,需要的朋友可以了解下
    2017-09-09
  • Spring的事務(wù)機(jī)制實(shí)例代碼

    Spring的事務(wù)機(jī)制實(shí)例代碼

    這篇文章主要介紹了Spring的事務(wù)機(jī)制實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02

最新評(píng)論

丽江市| 逊克县| 杭锦旗| 仙居县| 宜阳县| 新河县| 高密市| 福贡县| 化隆| 孟津县| 翼城县| 台中市| 磐石市| 海门市| 文成县| 肇庆市| 兴文县| 泽普县| 大同市| 陆良县| 博白县| 万州区| 中江县| 岗巴县| 武安市| 临潭县| 三亚市| 昌都县| 延吉市| 阿巴嘎旗| 铁力市| 乌拉特前旗| 麦盖提县| 远安县| 博兴县| 黑龙江省| 荥经县| 闽侯县| 鄂尔多斯市| 务川| 兰州市|