• 堆排序之Java实现


    堆排序之Java实现

    代码:

     1 package cn.com.zfc.lesson21.sort;
     2 
     3 /**
     4  * 
     5  * @title HeapSort
     6  * @describe 堆排序
     7  * @author 张富昌
     8  * @date 2016年10月2日下午5:33:50
     9  */
    10 public class HeapSort {
    11     public static void main(String[] args) {
    12         // 声明整型数组
    13         int[] array = new int[10];
    14         // 使用循环和随机数初始化数组
    15         for (int i = 0; i < array.length; i++) {
    16             array[i] = (int) Math.round(Math.random() * 100);
    17         }
    18         System.out.println("原始数组为:");
    19         for (int i : array) {
    20             System.out.print(i + " ");
    21         }
    22         System.out.println();
    23         System.out.println("排序后的数组为:");
    24         for (int i : heapSort(array)) {
    25             System.out.print(i + " ");
    26         }
    27     }
    28 
    29     /**
    30      * 
    31      * 功能:堆排序的基本思想是
    32      * 
    33      * 参数:int[] array
    34      *
    35      * 返回类型:int[]
    36      */
    37     public static int[] heapSort(int[] array) {
    38         int[] arr = array;
    39         for (int i = (arr.length - 2) / 2; i >= 0; i--) {
    40             // 将 0~[n-1]调整成大顶堆
    41             heapAdjust(arr, i, arr.length - 1);
    42         }
    43         for (int i = arr.length - 1; i > 0; i--) {
    44             // 第 i 趟排序
    45             swap(arr, 0, i);
    46             heapAdjust(arr, 0, i - 1);
    47         }
    48 
    49         return arr;
    50     }
    51 
    52     /**
    53      * 
    54      * 功能:将待排数组调节成大顶堆,调整 arr[low],使除它以外的元素成为大顶堆
    55      *
    56      * 参数:int[] arr, int low, int high
    57      *
    58      * 返回类型:void
    59      */
    60     public static void heapAdjust(int[] arr, int low, int high) {
    61         for (int f = low, i = 2 * low + 1; i <= high; i = 2 * i + 1) {
    62             // f 为被调整的结点,i 为 f 的最大孩子
    63             if (i < high && arr[i] < arr[i + 1]) {
    64                 // 右孩子更大,则 i 指向右孩子
    65                 i++;
    66             }
    67             if (arr[f] >= arr[i]) {
    68                 // 已经成为大顶堆了
    69                 break;
    70             }
    71             // 交换调整结点的位置
    72             swap(arr, f, i);
    73             // 让 i 成为新的调整结点
    74             f = i;
    75         }
    76     }
    77 
    78     /**
    79      * 
    80      * 功能:交换两个数的值
    81      *
    82      * 参数:int i, int j
    83      *
    84      * 返回类型:void
    85      */
    86     public static void swap(int[] arr, int i, int j) {
    87         int temp = arr[i];
    88         arr[i] = arr[j];
    89         arr[j] = temp;
    90 
    91     }
    92 }

    运行结果:

  • 相关阅读:
    ACM进阶
    hdu 2018 母牛的故事
    hdu 2084 数塔
    动态规划算法
    hdu 1003 Max sum
    hihocoder 1037 数字三角形
    UDP和TCP的区别(转)
    JS简单的图片左右滚动
    C# MD5加密的方法+一般处理程序使用Session+后台Json序列化
    CSS DIV 独占一行,清除左右两边的浮动
  • 原文地址:https://www.cnblogs.com/zfc-java/p/7941093.html
Copyright © 2020-2023  润新知