国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 堆排序?qū)嵗?Java數(shù)組實(shí)現(xiàn))

堆排序?qū)嵗?Java數(shù)組實(shí)現(xiàn))

2021-02-26 13:21GoldArowana Java教程

下面小編就為大家分享一篇使用Java數(shù)組實(shí)現(xiàn)堆排序的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧

堆排序:利用大根堆

數(shù)組全部入堆,再出堆從后向前插入回?cái)?shù)組中,數(shù)組就從小到大有序了。

?
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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 孩子節(jié)點(diǎn)下角標(biāo)是child,父節(jié)點(diǎn)下角表是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數(shù)組中某個元素的下角標(biāo)
  * @param b data數(shù)組中某個元素的下角標(biāo)
  * @return 哪個元素大就返回哪個的下角標(biāo)
  */
 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數(shù)組中某個元素的下角標(biāo)
  * @param b data數(shù)組中某個元素的下角標(biāo)
  * @param c data數(shù)組中某個元素的下角標(biāo)
  * @return 哪個元素大就返回哪個的下角標(biāo)
  */
 private int max(int a, int b, int c) {
  int biggest = max(a, b);
  biggest = max(biggest, c);
  return biggest;
 }
 
 
 /**
  * @param father 父節(jié)點(diǎn)下角標(biāo)是father,左右兩個孩子節(jié)點(diǎn)的下角表分別是: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即將更新,父、左、右三個結(jié)點(diǎn)誰大,newFather就是誰的下角標(biāo)
 
   if (lchild > size) {//如果該father結(jié)點(diǎn)既沒有左孩子,也沒有右孩子
    return;
   } else if (rchild > size) {//如果該father結(jié)點(diǎn)只有左孩子,沒有右孩子
    newFather = max(father, lchild);
   } else {//如果該father結(jié)點(diǎn)既有左孩子,又有右孩子
    newFather = max(father, lchild, rchild);
   }
 
   if (newFather == father) {//說明father比兩個子結(jié)點(diǎn)都要大,表名已經(jīng)是大根堆,不用繼續(xù)調(diào)整了
    return;
   } else {//否則,還需要繼續(xù)調(diào)整堆,直到滿足大根堆條件為止
    swap(father, newFather);//值進(jìn)行交換
    father = newFather;//更新father的值,相當(dāng)于繼續(xù)調(diào)整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
 }
}

堆排序:對數(shù)組進(jìn)行構(gòu)造堆(最大堆)

?
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
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,數(shù)組建堆
  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數(shù)組中某個元素的下角標(biāo)
  * @param b data數(shù)組中某個元素的下角標(biāo)
  * @return 哪個元素大就返回哪個的下角標(biāo)
  */
 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數(shù)組中某個元素的下角標(biāo)
  * @param b data數(shù)組中某個元素的下角標(biāo)
  * @param c data數(shù)組中某個元素的下角標(biāo)
  * @return 哪個元素大就返回哪個的下角標(biāo)
  */
 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) {//如果原父結(jié)點(diǎn)就是三者最大,則不用繼續(xù)整理堆了
    return;
   } else {//父節(jié)點(diǎn)不是最大,則把大的孩子交換上來,然后繼續(xù)往下堆調(diào)整,直到滿足大根堆為止
    swap(newFather, father);
    father = newFather;//相當(dāng)于繼續(xù)shiftDown(newFather)。假如newFather原來是father的左孩子,那就相當(dāng)于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
 }
}

以上這篇堆排序?qū)嵗?Java數(shù)組實(shí)現(xiàn))就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持服務(wù)器之家。

原文鏈接:http://www.cnblogs.com/noKing/p/7955197.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品欧美乱码久久久久久1区2区 | 少妇一级片免费看 | 久久亚洲一区二区三区明星换脸 | 羞羞动漫在线观看 | 色的视频网站 | 久久国产99| 久久成人免费视频 | 亚洲人成在线播放 | 精品国产区 | av在线电影网 | 欧美一区二区三区在线观看 | 91大片在线观看 | 一本大道久久精品 | 中文字幕高清在线 | 久久久久久免费看 | 久久国产精品久久久久久电车 | 国产高清在线观看 | 中文字幕一区二区三区四区 | 成人欧美一区二区三区在线观看 | 色伊人| 欧美成人激情视频 | 在线观看一区二区三区视频 | 福利黄色 | 亚洲第一色 | 国产成人在线一区 | 免费成人av| 亚洲精品欧美 | 日韩在线观看第一页 | 四虎影院网 | 精品视频成人 | 亚洲a在线观看 | 成人av电影在线观看 | 日本一区二区在线免费 | 九九久久国产 | 88av网站| 亚洲第一成人久久网站 | 天天玩天天操天天射 | 免费在线观看一区二区 | 久久久av| 国产成人黄色片 | 欧美日韩中文 |