forked from hansiming/JavaProject
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHeapSort.java
More file actions
97 lines (66 loc) · 1.51 KB
/
HeapSort.java
File metadata and controls
97 lines (66 loc) · 1.51 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
74
75
76
77
78
79
80
81
82
83
84
85
package com.csdhsm.sort;
/**
* @Title: HeapSort.java
* @Package: com.csdhsm.sort
* @Description 堆排序
* @author Han
* @date 2016-4-3 下午3:55:18
* @version V1.0
*/
public class HeapSort {
/**
* @Description 调整堆
* @author Han
* @param arr
* @param i
* @param size
*/
private void heapAdjust(int[] arr,int i,int size){
int lchild = i*2+1;//i节点的左子节点
int rchild = i*2+2;//i节点的右子节点
/**
* 右子节点大于左子节点
*/
if(rchild < size && arr[rchild] > arr[lchild]){
swap(arr,lchild,rchild);
}
/**
* 左子节点大于根节点
*/
if(lchild < size && arr[lchild] > arr[i]){
swap(arr,lchild,i);
}
}
/**
* @Description 建立堆
* @author Han
*/
private void buildHeap(int[] arr,int size){
int i = 0;
//依次调整各个堆
for(i = size/2;i>=1;i--){
heapAdjust(arr,i-1,size);
}
}
public void sort(int[] arr,int len){
buildHeap(arr,len);
for(int i = len-1 ; i>=1;i--){
//将有序堆中的第一个元素和最后一个元素交换,取出最后一个元素
swap(arr,0,i);
//将无序堆重新构造为有许多
buildHeap(arr,i);
}
}
/**
* @Description 自定义交换方法
* @author Han
* @param arr
* @param firstIndex
* @param secondIndex
*/
private void swap(int arr[],int firstIndex,int secondIndex){
int temp = arr[firstIndex];
arr[firstIndex] = arr[secondIndex];
arr[secondIndex] = temp;
}
}