我的“堆排序算法”实现

这是我的“堆排序算法”Java实现!

View Code
  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 **/

 

posted @ 2013-04-27 11:05  iGeneral  阅读(267)  评论(0编辑  收藏  举报