zoukankan      html  css  js  c++  java
  • 堆排序—Java

    堆排序:
    一棵完全二叉树,如果父节点的值大于等于左右节点的值,则称此完全二叉树为小根堆(小顶堆);如果父节点的值小于等于左右节点的值,则次完全二叉树为大根堆(大顶堆)。

    堆排序是建立在大顶堆或小顶堆的基础上的,通过不断的交换堆顶元素和堆尾元素,来对数组排序。基于大顶堆的堆排序,数组排序结果是升序的。基于小顶堆的堆排序,数组排序结果是降序的。

    流程:
    (1)建立堆 (注意调整的顺序是:从右往左,从下往上)
    (2)交换堆顶与堆底元素
    (3)调整堆(注意调整的顺序是:从0开始)

    代码:

    public class DuiPaiXu {
        //堆排序
        public  static void heapSort(int[] array) {
            if(array == null || array.length <=1 ) {
                return;
            }
    
            int totalIndex = array.length-1;
            buildHeap(array,totalIndex);
    
            while(totalIndex > 0) {
                swap(array,0,totalIndex);
                if(--totalIndex == 0) {
                    break;
                }
                adjustHeap(array,0, totalIndex);
            }
        }
    
        //根据数组建立堆
        public static void buildHeap(int[] array,int totalIndex) {
      //注意这里i是从(totalIndex-1)/2-1开始的,因为我索引值是从0开始的。 for(int i=(totalIndex-1)/2-1; i>=0; i--) { adjustHeap(array,i, totalIndex); } } //调整堆 public static void adjustHeap(int[] array,int curIndex, int totalIndex) { int biggestIndex = curIndex; int leftIndex = 2*curIndex +1; int rightIndex = 2*curIndex +2; if(rightIndex <= totalIndex) { if(array[curIndex] <array[leftIndex] || array[curIndex] <array[rightIndex]) { biggestIndex = array[leftIndex] > array[rightIndex] ? leftIndex : rightIndex; } } else if(leftIndex <= totalIndex ) { if(array[curIndex] <array[leftIndex]) { biggestIndex = leftIndex; } } if(biggestIndex != curIndex) { swap(array, curIndex, biggestIndex); adjustHeap(array, biggestIndex, totalIndex); } } public static void swap(int[] array,int i1, int i2) { int temp = array[i1]; array[i1] = array[i2]; array[i2] = temp; } public static void main(String[] args) { int[] array = {1,3,76,34,23,45,85,46,37}; heapSort(array); for(int i=0; i<array.length; i++) { System.out.print(array[i] + " "); } } }
  • 相关阅读:
    关于禁用发布可能出现的问题处理
    SQL Server数据库的整理优化的基本过程(一)
    分享SQL2005分区实现教程
    Oracle数据库的测试用户Scott的密码为什么是Tiger?
    这就是传说中的搜狗浏览器2.0
    IE6,IE7下双倍边距续
    IE7下fload:left造成双倍边距BUG
    as2和as3之间交互
    倒计时效果
    js拖动层效果
  • 原文地址:https://www.cnblogs.com/loren-Yang/p/7466116.html
Copyright © 2011-2022 走看看