• 我的“堆排序算法”实现


    这是我的“堆排序算法”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 **/
    欢迎转载,欢迎批评指正! 转载请注明: 转自博客园,转载地址:http://www.cnblogs.com/igeneral/
  • 相关阅读:
    REUSE_ALV_GRID_DISPLAY_LVC I_CALLBACK_HTML_TOP_OF_PAGE
    查找数组中最大值java
    jvm 调优
    jvm 内存
    树形遍历文件夹
    程序创建一个ArrayList,添加1到10的10个随机数,删除大于5的数 java
    字符串反序排序 并带有空格输出 java
    摆动排序
    免密登陆
    springboot UEditor集成
  • 原文地址:https://www.cnblogs.com/igeneral/p/3046618.html
Copyright © 2020-2023  润新知