标签:
摘要:
代码实现
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://www.cnblogs.com/Leo_wl/p/5377812.html