这是我的“堆排序算法”Java实现!
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 /* 2 * 目的:实现堆排序算法 3 * 注意:实际上没有heap这种内存数据结构,我们通过Array或LinkList来模拟,人为地看成是heap结构 4 * 功能:对一堆数进行非升排序 5 * 作者:陈沛锐 6 * 时间:2013.04.02 7 * 8 * 经验积累: 9 * 1.Random() seed 10 * 2.Array.length是Array中元素的个数,即Array中有多少个元素,例如,A的最大下标为6,则A.length=7;在定义数组时,int[] A=new int[length]; 11 * 3.Random() 产生任意区间范围的随机数(包括小数) 12 * 4.Math.Random(); 13 */ 14 package part02.chapter06; 15 16 import java.util.Random; 17 import java.util.Scanner; 18 19 public class _1exercise { 20 21 /** 22 * @param args 23 */ 24 public static void main(String[] args) { 25 Random ran = new Random(); 26 System.out.println("请输入您要生成的数据量(用整数表示):"); 27 Scanner myScanner = new Scanner(System.in);// 记得关闭资源 28 int A_length = myScanner.nextInt(); 29 int[] A = new int[A_length]; 30 // System.out.println(A.length);7 记得总结经验和注意点 31 System.out.println("请输入您要产生的数据的最大值:"); 32 int A_max = myScanner.nextInt(); 33 System.out.println("请输入您要产生的数据的最小值:"); 34 int A_min = myScanner.nextInt(); 35 System.out.println("随机产生的数据如下:"); 36 for (int i = 0; i < A_length; i++) { 37 //注意A_max-A_min后要+1才能包括最大值, 38 //因为nextInt()产生的是不包括参数的0-参数+1范围里的随机数 39 A[i] = ran.nextInt(A_max - A_min + 1) + A_min; 40 System.out.print(A[i] + " "); 41 } 42 System.out.println(); 43 HEAPSORT heapSort = new HEAPSORT(); 44 heapSort.sort(A, 0, A_length - 1);// 注意A_length-1 45 System.out.println("通过堆排序对数据进行排序后的数据如下:"); 46 for (int i = 0; i < A_length; i++) { 47 System.out.print(A[i] + " "); 48 } 49 // 关闭资源 50 if (myScanner != null) { 51 myScanner.close(); 52 } 53 } 54 55 } 56 57 // 堆排序类 58 class HEAPSORT { 59 int heap_length = 0; 60 61 public void sort(int[] A, int p, int r) { 62 heap_length = r - p + 1; 63 build_heap(A, p, r); 64 for (int i = r; i > p; i--) { 65 int temp = A[0]; 66 A[0] = A[i]; 67 A[i] = temp; 68 heap_length--; 69 max_heap(A, 0); 70 } 71 } 72 73 // 建堆 74 public void build_heap(int[] A, int p, int r) { 75 for (int i = (heap_length - 1) / 2; i >= 0; i--) { 76 max_heap(A, i); 77 } 78 System.out.println("将数据进行建堆后如下:"); 79 for (int i = 0; i < A.length; i++) { 80 System.out.print(A[i] + " "); 81 } 82 System.out.println(); 83 } 84 85 // 使以i节点为根节点的堆成为最大堆 86 public void max_heap(int[] A, int i) { 87 // 得到i左右子节点的下标 88 // 此处要注意i=0时,i==i_left;i_left==i_right;但是不影响要达到的判断目的,仅仅是命名表示不形象 89 int i_left = i * 2; 90 int i_right = i * 2 + 1; 91 // 取出三个节点中最大值的下标 92 int max_sub = i;// max_sub = i != 93 // 0;因为当i>(heap_length-1)/2时,一下if语句不执行,下一个if语句中max_sub!=i并且使该方法退出才正确 94 if (i <= (heap_length - 1) / 2) { 95 if (i_left < heap_length) {// 不是i_left <= heap_length && 96 // heap_length-1 != heap_length 97 if (A[i_left] > A[i]) { 98 max_sub = i_left; 99 } 100 } 101 if (i_right < heap_length) {// 不是i_right <= heap_length 102 if (A[max_sub] < A[i_right]) { 103 max_sub = i_right; 104 } 105 } 106 } 107 // 将三个节点中的最大值与A[i]互换,并递归调用 108 int temp = 0; 109 if (max_sub != i) { 110 temp = A[max_sub]; 111 A[max_sub] = A[i]; 112 A[i] = temp; 113 max_heap(A, max_sub); 114 } 115 } 116 } 117 /** 118 * a sample output: 119 请输入您要生成的数据量(用整数表示): 120 10 121 请输入您要产生的数据的最大值: 122 10 123 请输入您要产生的数据的最小值: 124 0 125 随机产生的数据如下: 126 0 0 7 1 9 10 4 2 2 6 127 将数据进行建堆后如下: 128 10 9 7 4 6 0 1 2 2 0 129 通过堆排序对数据进行排序后的数据如下: 130 0 0 1 2 2 4 6 7 9 10 131 **/