标签:
摘要:






















代码实现
|
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
|
public
class HeapSort { private
static void
heapSort(int[] arr) { int
len = arr.length -1; for(int
i = len/2
- 1; i >=0; i --){
//堆构造 heapAdjust(arr,i,len); } while
(len >=0){ swap(arr,0,len--);
//将堆顶元素与尾节点交换后,长度减1,尾元素最大 heapAdjust(arr,0,len);
//再次对堆进行调整 } }public
static void heapAdjust(int[] arr,int
i,int
len){ int
left,right,j ; while((left =
2*i+1) <= len){
//判断当前父节点有无左节点(即有无孩子节点,left为左节点) right = left +
1; //右节点 j = left;
//j"指针指向左节点" if(j < len && arr[left] < arr[right])
//右节点大于左节点 j ++;
//当前把"指针"指向右节点 if(arr[i] < arr[j])
//将父节点与孩子节点交换(如果上面if为真,则arr[j]为右节点,如果为假arr[j]则为左节点) swap(arr,i,j); else
//说明比孩子节点都大,直接跳出循环语句 break; i = j; }} public
static void
swap(int[] arr,int
i,int
len){ int
temp = arr[i]; arr[i] = arr[len]; arr[len] = temp; } public
static void
main(String[] args) { int
array[] = {20,50,20,40,70,10,80,30,60}; System.out.println("排序之前:"); for(int
element : array){ System.out.print(element+" "); } heapSort(array); System.out.println("\n排序之后:"); for(int
element : array){ System.out.print(element+" "); } }} |
输出:
排序之前: 20 50 20 40 70 10 80 30 60 排序之后: 10 20 20 30 40 50 60 70 80
标签:
原文地址:http://blog.csdn.net/three_bird/article/details/51344534