1 package sort;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 /**
7 * 最小堆排序
8 * Created by liuwei on 16/3/7.
9 */
10 public class MinHeap {
11
12 private List<Integer> heap = null;
13
14 public MinHeap(){
15 heap = new ArrayList<>();
16 }
17
18 public MinHeap(int[] nums){
19 heap = new ArrayList<>(nums.length);
20 for(int i=0; i<nums.length;i++){
21 heap.add(nums[i]);
22 }
23 adjust();
24 }
25
26 public void addElement(int number){
27 heap.add(number);
28 // adjust();
29 adjustFromDownToUp();
30 }
31
32 public int size(){
33 return heap.size();
34 }
35
36 public boolean isEmpty(){
37 for(Integer i : heap){
38 return false;
39 }
40 return true;
41 }
42
43 public Integer getTop(){
44 return isEmpty()? null:heap.get(0);
45 }
46
47 public Integer delTop(){
48 if(isEmpty()) return null;
49 int top = heap.remove(0);
50 if(!isEmpty()){
51 heap.add(0,heap.get(heap.size()-1));
52 heap.remove(heap.size()-1);
53 // adjust();
54 adjustFromUpToDown();
55 }
56 return top;
57 }
58
59 private void swap(int i,int j){
60 int tmp = heap.get(i);
61 heap.set(i,heap.get(j));
62 heap.set(j,tmp);
63 }
64
65 /**
66 * 全局调整
67 * */
68 private void adjust(){
69 if(size() <= 1) return;
70 int i = size() - 1;
71 int parent = 0;
72 if(i % 2 == 1){
73 parent = (i -1) / 2;
74 if(heap.get(i) < heap.get(parent)){
75 swap(i,parent);
76 }
77 i--;
78 }
79 while(i > 0){
80 parent = (i - 1) / 2;
81 int value = Math.min(heap.get(i-1),heap.get(i));
82 if(value < heap.get(parent)){
83 if(value == heap.get(i-1)){
84 swap(i-1,parent);
85 }
86 else{
87 swap(i,parent);
88 }
89 }
90 i= i -2;
91 }
92 }
93
94 //当删除一个元素的时候,是将最后一个元素,插入到之前第一个元素的位置,该元素后面是有序的,这时候自上向下调整
95 private void adjustFromUpToDown(){
96 if(size() < 2) return;
97 int index = 0;
98 int left = 2 * index + 1;
99 int right = 2 * index + 2;
100 while(index < size() ){
101 if(right < size()){
102 int value = Math.min(heap.get(left),heap.get(right));
103 if(value < heap.get(index)){
104 if(value == heap.get(left)){
105 swap(left,index);
106 index = left;
107 }
108 else{
109 swap(right,index);
110 index = right;
111 }
112 left = 2 * index + 1;
113 right = 2 * index + 2;
114 }
115 else{
116 return;
117 }
118 }
119 else if(left < size()){
120 if(heap.get(left) < heap.get(index)){
121 swap(left,index);
122 }
123 return;
124 }
125 else{
126 return;
127 }
128 }
129 }
130
131 //当增加一个元素的时候,是插入到最后一个位置,这时候,前面是有序的,这时候自下而上的调整
132 private void adjustFromDownToUp(){
133 if(size() < 2) return;
134 int index = heap.size() - 1;
135 int parent = (index - 1) / 2;
136 if(index % 2 == 1){
137 if(heap.get(index) < heap.get(parent)){
138 swap(index,parent);
139 index = parent;
140 }
141 else{
142 return;
143 }
144 }
145 int left = 0, right = 0;
146 while(index > 0){
147 parent = (index - 1)/2;
148 if(index % 2 == 1){
149 left = index;
150 right = index + 1;
151 }
152 else{
153 left = index - 1;
154 right = index;
155 }
156 int value = Math.min(heap.get(left),heap.get(right));
157 if(value < heap.get(parent)){
158 if(value == heap.get(left)){
159 swap(left,parent);
160 }
161 else{
162 swap(right,parent);
163 }
164 index = parent;
165 }
166 else{
167 return;
168 }
169 }
170 }
171
172
173 public void show(){
174 for(Integer i : heap){
175 System.out.print(i+" ");
176 }
177 System.out.println();
178 }
179
180 public static void main(String[] args) {
181 int[] nums = {9,12,17,30,50,20,60,65,4};
182 MinHeap heap = new MinHeap();
183 // heap.show();
184 // heap.addElement(49);
185 // heap.show();
186 // while(!heap.isEmpty()){
187 // System.out.print(heap.delTop()+" ");
188 // }
189 // System.out.println();
190
191 for(int i=0; i<nums.length;i++){
192 heap.addElement(nums[i]);
193 // heap.show();
194 }
195
196 while(!heap.isEmpty()){
197 System.out.print(heap.delTop()+" ");
198 }
199 System.out.println();
200 }
201 }