亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

堆排序實例(Java數組實現)

2024-07-13 10:13:21
字體:
來源:轉載
供稿:網友

堆排序:利用大根堆

數組全部入堆,再出堆從后向前插入回數組中,數組就從小到大有序了。

public class MaxHeap<T extends Comparable<? super T>> { private T[] data; private int size; private int capacity;  public MaxHeap(int capacity) {  this.data = (T[]) new Comparable[capacity + 1];  size = 0;  this.capacity = capacity; }  public int size() {  return this.size; }  public boolean isEmpty() {  return size == 0; }  public int getCapacity() {  return this.capacity; }  /**  * @return 查看最大根(只看不刪, 與popMax對比)  */ public T seekMax() {  return data[1]; }  public void swap(int i, int j) {  if (i != j) {   T temp = data[i];   data[i] = data[j];   data[j] = temp;  } }  public void insert(T item) {  size++;  data[size] = item;  shiftUp(size); }  /**  * @return 彈出最大根(彈出意味著刪除, 與seekMax對比)  */ public T popMax() {  swap(1, size--);  shiftDown(1);  return data[size + 1]; }  /**  * @param child 孩子節點下角標是child,父節點下角表是child/2  */ public void shiftUp(int child) {  while (child > 1 && data[child].compareTo(data[child / 2]) > 0) {   swap(child, child / 2);   child = child / 2;  } }  /**  * @param a data數組中某個元素的下角標  * @param b data數組中某個元素的下角標  * @return 哪個元素大就返回哪個的下角標  */ private int max(int a, int b) {  if (data[a].compareTo(data[b]) < 0) {//如果data[b]大   return b;//返回b  } else {//如果data[a]大   return a;//返回a  } }  /**  * @param a data數組中某個元素的下角標  * @param b data數組中某個元素的下角標  * @param c data數組中某個元素的下角標  * @return 哪個元素大就返回哪個的下角標  */ private int max(int a, int b, int c) {  int biggest = max(a, b);  biggest = max(biggest, c);  return biggest; }   /**  * @param father 父節點下角標是father,左右兩個孩子節點的下角表分別是:father*2 和 father*2+1  */ public void shiftDown(int father) {  while (true) {   int lchild = father * 2;//左孩子   int rchild = father * 2 + 1;//右孩子   int newFather = father;//newFather即將更新,父、左、右三個結點誰大,newFather就是誰的下角標    if (lchild > size) {//如果該father結點既沒有左孩子,也沒有右孩子    return;   } else if (rchild > size) {//如果該father結點只有左孩子,沒有右孩子    newFather = max(father, lchild);   } else {//如果該father結點既有左孩子,又有右孩子    newFather = max(father, lchild, rchild);   }    if (newFather == father) {//說明father比兩個子結點都要大,表名已經是大根堆,不用繼續調整了    return;   } else {//否則,還需要繼續調整堆,直到滿足大根堆條件為止    swap(father, newFather);//值進行交換    father = newFather;//更新father的值,相當于繼續調整shiftDown(newFather)   }  } }  public static <T extends Comparable<? super T>> void sort(T[] arr) {  int len = arr.length;  //入堆  MaxHeap<T> maxHeap = new MaxHeap<T>(len);  for (int i = 0; i < len; i++) {   maxHeap.insert(arr[i]);  }  //出堆  for (int i = len - 1; i >= 0; i--) {   arr[i] = maxHeap.popMax();  } }  public static void printArr(Object[] arr) {  for (Object o : arr) {   System.out.print(o);   System.out.print("/t");  }  System.out.println(); }  public static void main(String args[]) {  Integer[] arr = {3, 5, 1, 7, 2, 9, 8, 0, 4, 6};  printArr(arr);//3 5 1 7 2 9 8 0 4 6  sort(arr);  printArr(arr);//0 1 2 3 4 5 6 7 8 9 }}

堆排序:對數組進行構造堆(最大堆)

public class MaxHeap<T extends Comparable<? super T>> { private T[] data; private int size; private int capacity;  public MaxHeap(int capacity) {  this.capacity = capacity;  this.size = 0;  this.data = (T[]) new Comparable[capacity + 1]; }  public MaxHeap(T[] arr) {//heapify,數組建堆  capacity = arr.length;  data = (T[]) new Comparable[capacity + 1];  System.arraycopy(arr, 0, data, 1, arr.length);  size = arr.length;  for (int i = size / 2; i >= 1; i--) {   shiftDown(i);  } }  public int size() {  return this.size; }  public int getCapacity() {  return this.capacity; }  public boolean isEmpty() {  return size == 0; }  public T seekMax() {  return data[1]; }  public void swap(int i, int j) {  if (i != j) {   T temp = data[i];   data[i] = data[j];   data[j] = temp;  } }  public void insert(T item) {  size++;  data[size] = item;  shiftUp(size); }  public T popMax() {  swap(1, size--);  shiftDown(1);  return data[size + 1]; }  public void shiftUp(int child) {  while (child > 1 && data[child].compareTo(data[child / 2]) > 0) {   swap(child, child / 2);   child /= 2;  } }  /**  * @param a data數組中某個元素的下角標  * @param b data數組中某個元素的下角標  * @return 哪個元素大就返回哪個的下角標  */ private int max(int a, int b) {  if (data[a].compareTo(data[b]) < 0) {//如果data[b]大   return b;//返回b  } else {//如果data[a]大   return a;//返回a  } }  /**  * @param a data數組中某個元素的下角標  * @param b data數組中某個元素的下角標  * @param c data數組中某個元素的下角標  * @return 哪個元素大就返回哪個的下角標  */ private int max(int a, int b, int c) {  int biggest = max(a, b);  biggest = max(biggest, c);  return biggest; }  public void shiftDown(int father) {  while (true) {   int lchild = father * 2;   int rchild = father * 2 + 1;   int newFather = father;//這里賦不賦值無所謂,如果把下面這個return改成break,那就必須賦值了    if (lchild > size) {//如果沒有左、右孩子    return;   } else if (rchild > size) {//如果沒有右孩子    newFather = max(father, lchild);   } else {//如果有左、右孩子    newFather = max(father, lchild, rchild);   }    if (newFather == father) {//如果原父結點就是三者最大,則不用繼續整理堆了    return;   } else {//父節點不是最大,則把大的孩子交換上來,然后繼續往下堆調整,直到滿足大根堆為止    swap(newFather, father);    father = newFather;//相當于繼續shiftDown(newFather)。假如newFather原來是father的左孩子,那就相當于shiftDown(2*father)   }  } }  public static <T extends Comparable<? super T>> void sort(T[] arr) {  int len = arr.length;  MaxHeap<T> maxHeap = new MaxHeap<>(arr);  for (int i = len - 1; i >= 0; i--) {   arr[i] = maxHeap.popMax();  } }  public static void printArr(Object[] arr) {  for (Object o : arr) {   System.out.print(o);   System.out.print("/t");  }  System.out.println(); }  public static void main(String args[]) {  Integer[] arr = {3, 5, 1, 7, 2, 9, 8, 0, 4, 6};  printArr(arr);//3 5 1 7 2 9 8 0 4 6  sort(arr);  printArr(arr);//0 1 2 3 4 5 6 7 8 9 }}

以上這篇堆排序實例(Java數組實現)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
黑人巨大精品欧美一区二区免费| 日韩在线欧美在线| 欧美性xxxxxxx| 麻豆国产精品va在线观看不卡| 国产精品久久久久久影视| 国产日韩欧美在线播放| 久久久成人精品| 国产91露脸中文字幕在线| 久久综合免费视频影院| 日韩av网站电影| 视频在线观看一区二区| 国产精品美女久久久久久免费| 隔壁老王国产在线精品| 精品久久久久久久久久ntr影视| 啊v视频在线一区二区三区| 欧美中在线观看| 亚洲欧美999| 国产脚交av在线一区二区| 亚洲国产成人精品一区二区| 国产精品久久电影观看| 中文字幕精品久久久久| 夜夜嗨av色一区二区不卡| 精品国产成人av| 国产在线日韩在线| 亚洲精品福利在线观看| 欧美放荡办公室videos4k| 国产视频精品xxxx| 91高清在线免费观看| 久久免费成人精品视频| 91色中文字幕| 精品久久久999| 亚洲奶大毛多的老太婆| 欧美激情videoshd| 欧美野外猛男的大粗鳮| 国产精品av在线| 69久久夜色精品国产69| 91精品国产成人www| 亚洲精品网站在线播放gif| 亚洲欧美中文日韩v在线观看| 精品日韩美女的视频高清| 欧美综合国产精品久久丁香| 国产视频精品免费播放| 在线观看亚洲视频| 日日摸夜夜添一区| 久久久亚洲国产| 最近中文字幕mv在线一区二区三区四区| 欧美午夜www高清视频| 欧美体内谢she精2性欧美| 在线亚洲男人天堂| 欧美怡红院视频一区二区三区| 久久人91精品久久久久久不卡| 国产91在线播放九色快色| 日本成人激情视频| zzjj国产精品一区二区| 亚洲人精选亚洲人成在线| 欧美丰满少妇xxxxx做受| www.久久久久久.com| 91亚洲国产成人精品性色| 日本国产一区二区三区| 亚洲欧美www| 国产伦精品免费视频| 神马久久久久久| 精品久久久国产| 九九久久久久99精品| 欧美成人免费观看| 欧美电影免费观看大全| 亚洲精品欧美日韩专区| 国产啪精品视频网站| 久久精品一偷一偷国产| 日本欧美国产在线| 狠狠做深爱婷婷久久综合一区| 久久人人爽国产| 久久久人成影片一区二区三区| 米奇精品一区二区三区在线观看| 91干在线观看| 91免费看国产| 中文国产成人精品| 久久亚洲国产精品| 国产日韩欧美中文| 中文字幕日韩欧美精品在线观看| 97视频色精品| 成人两性免费视频| 亚洲成人a**站| 国产精品日本精品| 亚洲国产欧美精品| 亚洲天堂男人天堂| 91精品在线影院| 这里精品视频免费| 精品成人乱色一区二区| 少妇高潮久久久久久潘金莲| 久久久久久有精品国产| 久久久女人电视剧免费播放下载| 日韩精品视频免费在线观看| 欧美专区在线视频| 欧美日韩成人黄色| 欧美日韩免费区域视频在线观看| 欧美一区深夜视频| 日韩成人xxxx| 欧美人在线视频| 2019亚洲男人天堂| 色综合伊人色综合网| 国内精品久久久久伊人av| 在线视频亚洲欧美| 欧美激情精品久久久久久蜜臀| 一本大道亚洲视频| 亚洲美女福利视频网站| 欧美精品久久久久a| 欧美日韩国产一区在线| 久久久99久久精品女同性| 777精品视频| 亚洲精品国产精品乱码不99按摩| 日韩精品在线第一页| 成人黄色片在线| 亚洲伊人久久大香线蕉av| 一区二区三区 在线观看视| 欧美性视频网站| 亚洲午夜精品久久久久久久久久久久| 国产精品九九久久久久久久| 91久久精品国产91久久| 精品久久久久久亚洲精品| 热99精品只有里视频精品| 另类少妇人与禽zozz0性伦| 91精品国产综合久久久久久蜜臀| 4388成人网| 久久在线精品视频| 日韩中文字幕在线看| 久久久噜噜噜久噜久久| 81精品国产乱码久久久久久| 亚洲天堂日韩电影| 一区二区三区四区精品| 成人免费高清完整版在线观看| 亚洲国产一区二区三区在线观看| 色yeye香蕉凹凸一区二区av| 欧美一区二区视频97| 亚洲肉体裸体xxxx137| 九九久久久久久久久激情| 成人欧美一区二区三区黑人| 欧美激情a在线| 日本午夜人人精品| 91精品久久久久久久| 亚洲色图25p| 精品亚洲aⅴ在线观看| 狠狠久久亚洲欧美专区| 日韩国产在线看| 欧美日韩国产中文精品字幕自在自线| 91探花福利精品国产自产在线| 91免费的视频在线播放| 日韩中文字幕视频在线观看| 亚洲视频国产视频| 亚洲国产成人精品电影| 国产精品久久久久久久久久久久久久| 欧美日韩一区二区在线| 美女少妇精品视频| 欧美日韩福利在线观看| 久久久久久97| 国产一区二区三区中文| 久久久精品一区| 国产一区二区三区在线播放免费观看| 国产视频自拍一区| 国产精品扒开腿做爽爽爽的视频| 亚洲成人久久电影| 最近2019中文字幕大全第二页| 2019中文字幕免费视频| 日韩欧美在线观看视频|