zoukankan      html  css  js  c++  java
  • 自己整理的算法 (6)堆排序

    package sort;
    
    //最大堆的特性是,某个节点的值最多和其父节点的值一样大。这样,堆中的最大元素存放在根节点中
    //;并且,在以某一个节点为根的子树中,各节点的值都不大于该子树根节点的值
    
    public class HeapSort {  
     
    
        public static void heapSort(int[] list) {  
            if (list == null || list.length <= 1) {  
                return;  
            }  
          //构建最大堆
            //相当于add的作用,此方法结束后,就构建好了有序的二叉堆
            buildMaxHeap(list);  
         //循环,每次把根节点和最后一个节点调换位置
            for (int i = list.length - 1; i >= 1; i--) {  
            	 int tmp = list[0];  
                 list[0] = list[i];  
                 list[i] = tmp;  
         //每次堆得长度都减少1,也就是排除置换到最后的根节点
                 //相当于删除最大节点(其实是放在数组最后,然后再排序忽视最后的那些位置)
                 //把最后的节点放在根节点处,然后在用maxHeap进行比较交换即可
                 //此时从index=0即交换后的根节点位置开始重新排序 
                maxHeap(list, 0, i);  
            }  
        }  
        //根据输入数组构建一个最大堆
        private static void buildMaxHeap(int[] list) {  
            if (list == null || list.length <= 1) {  
                return;  
            }  
            //这个half为可能存在子节点的最大的位置
            for (int i = list.length/2; i >= 0; i--) {  
                maxHeap(list, i, list.length);  
            }  
        }  
        //堆调整,使其生成最大堆
        private static void maxHeap(int[] list, int index, int heapSize) {  
           // 左子节点索引
        	int left = index * 2 + 1;  
          //右子节点索引
            int right = index * 2 + 2;  
          //最大节点索引
            int largest = index; 
            
            //如果左子节点大于父节点,则将左子节点作为最大节点
            if (left < heapSize && list[left] > list[index]) {  
                largest = left;  
            }  
            //如果右子节点比最大节点还大,则最大节点为右子节点
            if (right < heapSize &&list[right] > list[largest]) {  
                largest = right;  
            }  
            //最后,如果最大节点和父节点不一致,则交换他们的值
            if (index != largest) {  
            	 int tmp = list[index];  
                 list[index] = list[largest];  
                 list[largest] = tmp;  
             //交换完父节点和子节点的值,对换了值的子节点检查是否符合最大堆特性
    
                maxHeap(list, largest, heapSize);  
            }  
        }  
        
        
        public static void main(String[] args) {  
            int[] list = { 4,9,8,2,-1,5 };  
            heapSort(list);  
            for(int i =0;i<list.length;i++)
            	System.out.print(list[i]+" ");
        }  
    } 
    

      

  • 相关阅读:
    Docker 第一章 安装测试
    时区
    操作系统层虚拟化
    KVM
    基于秘钥的登录认证
    Hypervisor
    通过域名区分不同网站服务
    硬件虚拟化
    虚拟化初识
    nginx rewrite (转发)
  • 原文地址:https://www.cnblogs.com/kisty/p/5851255.html
Copyright © 2011-2022 走看看