zoukankan      html  css  js  c++  java
  • 用Java实现一个堆排序

    堆可以看成是一个完全二叉树,而且非终端节点的值均不大于(不小于)其左右孩子节点的值。堆排序只需要一个记录大小的辅助空间,输出堆顶的值之后需要对堆进行调整建立新堆,找到剩下节点的最大值(最小值),反复执行。

    package java_net_test;
    //大顶堆
    public class Java_HeapSort {
    
     public static void main(String[] args) {
       int[] array = {-1,16,7,3,20,17,8};  
    
             System.out.println("Before heap:");  
             printArray(array);  
    
             heapSort(array);  
    
             System.out.println("After heap sort:");  
             printArray(array);
    
     }
     
     
     //printArray函数是将数字打印出来
     
     public static void printArray(int[] array) {  
            System.out.print("{");  
            for (int i = 0; i < array.length; i++) {  
                System.out.print(array[i]);  
                if (i < array.length - 1) {  
                    System.out.print(", ");  
                }  
            }  
            System.out.println("}");  
        }  
     
     public static void heapSort(int[] array) {  
            if (array == null || array.length <= 1) {  
                return;  
            }  
    
            buildMaxHeap(array);  //建堆
    
            for (int i = array.length - 1; i >= 1; i--) {  
                exchangeElements(array, 0, i);  //将堆顶的元素放在数组的最后的一个位置
    
                maxHeap(array, i, 0);// 被置换的堆顶需要重新调整一次
            }  
        }  
     
     private static void buildMaxHeap(int[] array) {  
            if (array == null || array.length <= 1) {  
                return;  
            }  
    
            for (int i = array.length / 2; i >= 0; i--) {  
                maxHeap(array, array.length, i); //从非叶子节点开始调整
            }  
        }  
     
     public static void exchangeElements(int[] array, int index1, int index2) {  
            int temp = array[index1];  
            array[index1] = array[index2];  
            array[index2] = temp;  
        }  
    
     
     private static void maxHeap(int[] array, int heapSize, int index) {  //实现节点index开始向下调整,保证之前index上的值满足堆
            int left = index * 2 + 1;  
            int right = index * 2 + 2;  
    
            int largest = index;  
            if (left < heapSize && array[left] > array[index]) {  
                largest = left;  
            }  
    
            if (right < heapSize && array[right] > array[largest]) {  
                largest = right;  
            }  
    
            if (index != largest) {  //largest中的值比index大,进行交换
                exchangeElements(array, index, largest);  
    
                maxHeap(array, heapSize, largest);  //largest是被换掉的位置,对于交换后出现的问题用递归重新检查一遍。该递归的方法比for来比较每个要快
            }  
        }  
     
    
    
    }
    
    
    ------------------------------------------------------------------------------------------------------------------------------本娃的学习日记@lily园
  • 相关阅读:
    MVVM框架-MVVMLight
    WPF多值绑定及多值转换(MultiBinding和IMultiValueConverter)
    WPF使用转换器(Converter)
    WPF绑定功能常用属性介绍
    WPF绑定属性
    Java工作笔记:工作中使用JNA调用C++库的一些细节(转载)
    关于使用sudo命令后找不到JAVA_HOME的问题
    IDEA入门级使用教程
    dubbo协议参考手册(转)
    Javascript 基础夯实 —— 使用 webWorker 实现多线程(转)
  • 原文地址:https://www.cnblogs.com/yanglicyfsdm/p/4710195.html
Copyright © 2011-2022 走看看