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

java數(shù)據(jù)結(jié)構(gòu)排序算法之樹形選擇排序詳解

 更新時(shí)間:2017年05月29日 11:55:14   作者:android小豬  
這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)排序算法之樹形選擇排序,結(jié)合具體實(shí)例形式分析了java樹形選擇排序的原理、實(shí)現(xiàn)技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了java數(shù)據(jù)結(jié)構(gòu)排序算法之樹形選擇排序。分享給大家供大家參考,具體如下:

這里我們就來說說選擇類排序之一的排序:樹形選擇排序

在簡單選擇排序中,每次的比較都沒有用到上次比較的結(jié)果,所以比較操作的時(shí)間復(fù)雜度是O(N^2),想要降低比較的次數(shù),則需要把比較過程中的大小關(guān)系保存下來。樹形選擇排序是對簡單選擇排序的改進(jìn)。

樹形選擇排序:又稱錦標(biāo)賽排序(Tournament Sort),是一種按照錦標(biāo)賽的思想進(jìn)行選擇排序的方法。首先對n個(gè)記錄的關(guān)鍵字進(jìn)行兩兩比較,然后在n/2個(gè)較小者之間再進(jìn)行兩兩比較,如此重復(fù),直至選出最小的記錄為止。

算法實(shí)現(xiàn)代碼如下:

package exp_sort;
public class TreeSelectSort {
 public static int[] TreeSelectionSort(int[] mData) {
  int TreeLong = mData.length * 4;
  int MinValue = -10000;
  int[] tree = new int[TreeLong]; // 樹的大小
  int baseSize;
  int i;
  int n = mData.length;
  int max;
  int maxIndex;
  int treeSize;
  baseSize = 1;
  while (baseSize < n) {
   baseSize *= 2;
  }
  treeSize = baseSize * 2 - 1;
  for (i = 0; i < n; i++) {
   tree[treeSize - i] = mData[i];
  }
  for (; i < baseSize; i++) {
   tree[treeSize - i] = MinValue;
  }
  // 構(gòu)造一棵樹
  for (i = treeSize; i > 1; i -= 2) {
   tree[i / 2] = (tree[i] > tree[i - 1] ? tree[i] : tree[i - 1]);
  }
  n -= 1;
  while (n != -1) {
   max = tree[1];
   mData[n--] = max;
   maxIndex = treeSize;
   while (tree[maxIndex] != max) {
    maxIndex--;
   }
   tree[maxIndex] = MinValue;
   while (maxIndex > 1) {
    if (maxIndex % 2 == 0) {
     tree[maxIndex / 2] = (tree[maxIndex] > tree[maxIndex + 1] ? tree[maxIndex]
       : tree[maxIndex + 1]);
    } else {
     tree[maxIndex / 2] = (tree[maxIndex] > tree[maxIndex - 1] ? tree[maxIndex]
       : tree[maxIndex - 1]);
    }
    maxIndex /= 2;
   }
  }
  return mData;
 }
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  int array[] = { 38, 62, 35, 77, 55, 14, 35, 98 };
  TreeSelectionSort(array);
  for (int i = 0; i < array.length; i++) {
   System.out.print(array[i] + " ");
  }
  System.out.println("\n");
 }
}

算法分析:

在樹形選擇排序中,除了最小的關(guān)鍵字,被選出的最小關(guān)鍵字都是走了一條由葉子結(jié)點(diǎn)到跟節(jié)點(diǎn)的比較過程,由于含有n個(gè)葉子結(jié)點(diǎn)的完全二叉樹的深度log2n+1,因此在樹形選擇排序中,每選出一個(gè)較小關(guān)鍵字需要進(jìn)行l(wèi)og2n次比較,所以其時(shí)間復(fù)雜度是O(nlog2n),移動(dòng)記錄次數(shù)不超過比較次數(shù),故總的算法時(shí)間復(fù)雜度為O(nlog2n),與簡單選擇排序算法相比,降低了比較次數(shù)的數(shù)量級,增加了n-1個(gè)額外的存儲(chǔ)空間存放中間比較結(jié)果。

補(bǔ)充:

這里再來介紹對樹形選擇排序的改進(jìn)算法,即堆排序算法。

堆排序彌補(bǔ)了樹形選擇排序算法占用空間多的缺憾。采用堆排序時(shí),只需要一個(gè)記錄大小的輔助空間。

算法思想是:

把待排序記錄的關(guān)鍵字存放在數(shù)組r[1...n]中,將r看成是一棵完全二叉樹的順序表示,每個(gè)結(jié)點(diǎn)表示一個(gè)記錄,第一個(gè)記錄r[1]作為二叉樹的根,以下每個(gè)記錄r[2...n]依次逐層從左到右順序排列,任意結(jié)點(diǎn)r[i]的左孩子是r[2*i],右孩子是r[2*i+1];雙親是r[[i/2]]。

堆定義:各結(jié)點(diǎn)的關(guān)鍵字值滿足下列條件:

r[i].key >= r[2i].key 且 r[i].key >= r[2i+1].key   (i=1,2,……[i/2])

滿足上面條件的完全二叉樹稱為大根堆;相反,如果這顆完全二叉樹中任意結(jié)點(diǎn)的關(guān)鍵字小于或者等于其左孩子和右孩子的關(guān)鍵字,對應(yīng)的堆叫做小根堆。

堆排序的過程主要需要解決兩個(gè)問題:第一個(gè)是,按照堆定義建初堆;第二個(gè)是,去掉最大元后重建堆,得到次大元。

堆排序即是利用堆的特性對記錄序列進(jìn)行排序,過程如下:

1、對給定序列建堆;
2、輸出堆頂;(首元素與尾元素交換)
3、對剩余元素重建堆;(篩選首元素)
4、重復(fù)2,3,直至所有元素輸出。

注意:“篩選”須從第[n/2]個(gè)結(jié)點(diǎn)開始,逐層向上倒退,直到根結(jié)點(diǎn)。

算法分析:

1. 對深度為 k 的堆,“篩選”所需進(jìn)行的關(guān)鍵字比較的次數(shù)至多為2(k-1);
2. n 個(gè)關(guān)鍵字的堆深度為  [log2n]+1, 初建堆所需進(jìn)行的關(guān)鍵字比較的次數(shù)至多為:n* [log2n];
3. 重建堆 n-1 次,所需進(jìn)行的關(guān)鍵字比較的次數(shù)不超過:(n-1)*2 [log2n ]; 

因此,堆排序在最壞情況下,其時(shí)間復(fù)雜度為O(nlog2n),這是堆排序的最大優(yōu)點(diǎn)。

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

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

相關(guān)文章

  • 詳解Java程序啟動(dòng)時(shí)-D指定參數(shù)是什么

    詳解Java程序啟動(dòng)時(shí)-D指定參數(shù)是什么

    java服務(wù)啟動(dòng)的時(shí)候,都會(huì)指定一些參數(shù),下面這篇文章主要給大家介紹了關(guān)于Java程序啟動(dòng)時(shí)-D指定參數(shù)是什么的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • MyBatis?Generator?ORM層面的代碼自動(dòng)生成器(推薦)

    MyBatis?Generator?ORM層面的代碼自動(dòng)生成器(推薦)

    Mybatis?Generator是一個(gè)專門為?MyBatis和?ibatis框架使用者提供的代碼生成器,也可以快速的根據(jù)數(shù)據(jù)表生成對應(yīng)的pojo類、Mapper接口、Mapper文件,甚至生成QBC風(fēng)格的查詢對象,這篇文章主要介紹了MyBatis?Generator?ORM層面的代碼自動(dòng)生成器,需要的朋友可以參考下
    2023-01-01
  • SpringMVC中RequestBody注解的List參數(shù)傳遞方式

    SpringMVC中RequestBody注解的List參數(shù)傳遞方式

    這篇文章主要介紹了SpringMVC中RequestBody注解的List參數(shù)傳遞方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 阿里云主機(jī)上安裝jdk 某庫出現(xiàn)問題的解決方法

    阿里云主機(jī)上安裝jdk 某庫出現(xiàn)問題的解決方法

    今天安裝jdk到阿里云服務(wù)上,首先看下阿里云是32位還是64位的,如果是32位下載32位的包,如果是64位的下載64位的包,下面與大家分享下安裝過程中遇到問題的解決方法
    2013-06-06
  • 基于Maven pom文件使用分析

    基于Maven pom文件使用分析

    本文詳細(xì)介紹了Maven項(xiàng)目的核心配置文件pom.xml的結(jié)構(gòu)和各個(gè)元素的用途,包括項(xiàng)目基礎(chǔ)信息、依賴管理、倉庫配置、構(gòu)建配置、版本控制、分發(fā)和報(bào)告配置等,幫助讀者全面了解Maven項(xiàng)目的構(gòu)建和管理過程
    2024-12-12
  • Java concurrency之AtomicLong原子類_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java concurrency之AtomicLong原子類_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    AtomicLong是作用是對長整形進(jìn)行原子操作。下面通過本文給大家介紹Java concurrency之AtomicLong原子類的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2017-06-06
  • Java定時(shí)任務(wù)實(shí)現(xiàn)優(yōu)惠碼的示例代碼

    Java定時(shí)任務(wù)實(shí)現(xiàn)優(yōu)惠碼的示例代碼

    在Java中實(shí)現(xiàn)定時(shí)任務(wù)來發(fā)放優(yōu)惠碼,我們可以使用多種方法,比如使用java.util.Timer類、ScheduledExecutorService接口,或者更高級的框架如Spring的@Scheduled注解,這篇文章主要介紹了Java定時(shí)任務(wù)實(shí)現(xiàn)優(yōu)惠碼的實(shí)例,需要的朋友可以參考下
    2024-07-07
  • 基于servlet的執(zhí)行原理與生命周期(全面解析)

    基于servlet的執(zhí)行原理與生命周期(全面解析)

    下面小編就為大家分享一篇servlet的執(zhí)行原理與生命周期全面解析,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • Java設(shè)計(jì)模式之java迭代器模式詳解

    Java設(shè)計(jì)模式之java迭代器模式詳解

    這篇文章主要介紹了java迭代器模式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-09-09
  • Java類初始化順序詳解

    Java類初始化順序詳解

    這篇文章主要介紹了Java類初始化順序詳解,java語言在使用過程中最先開始就是初始化,在工作中如果遇到什么問題需?要定位往往到最后也可能是初始化的問題,因此掌握初始化的順序很重要,需要的朋友可以參考下
    2023-08-08

最新評論

昆山市| 兴山县| 潮州市| 无极县| 浦东新区| 临沭县| 梅州市| 津市市| 勐海县| 宣化县| 肥乡县| 镇原县| 湟中县| 宁河县| 泾源县| 西吉县| 平远县| 土默特左旗| 平罗县| 黑山县| 嘉黎县| 福泉市| 常德市| 天津市| 靖安县| 如皋市| 屯门区| 淮阳县| 西乌珠穆沁旗| 永吉县| 佛山市| 祁连县| 郓城县| 岳普湖县| 毕节市| 乌兰浩特市| 海南省| 海兴县| 龙江县| 彭山县| 安国市|