Repository navigation
Expand file tree
/
Copy pathHeapSort.java
More file actions
73 lines (57 loc) · 1.58 KB
/
Copy pathHeapSort.java
File metadata and controls
73 lines (57 loc) · 1.58 KB
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
package Sort;
public class HeapSort<T extends Comparable<T>> {
private int size;
public void sort(T[] arr) {
this.size = arr.length;
for (int i = parent(size - 1); i >= 0; i--) {
siftDown(arr, i);
}
while (size > 0) {
swap(arr, 0, size - 1);
size--;
siftDown(arr, 0);
}
}
private int parent(int i) {
return (i - 1) / 2;
}
private int leftChild(int i) {
return i * 2 + 1;
}
private int rightChild(int i) {
return i * 2 + 2;
}
private void siftDown(T[] arr, int i) {
while (true) {
int largest = i;
int left = leftChild(i);
int right = rightChild(i);
if (left < size && arr[left].compareTo(arr[largest]) > 0) {
largest = left;
}
if (right < size && arr[right].compareTo(arr[largest]) > 0) {
largest = right;
}
if (largest == i) {
break;
}
swap(arr, i, largest);
i = largest;
}
}
private void swap(T[] arr, int i, int j) {
T tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
public static void main(String[] args) {
Integer[] arr = { 3, 1, 9, 5, 2, 8, 7, 4 };
HeapSort<Integer> heapsort = new HeapSort<>();
heapsort.sort(arr);
System.out.println("heap sort result");
for (Object x : arr) {
System.out.print(x + " ");
}
System.out.println();
}
}