zoukankan      html  css  js  c++  java
  • 最大堆,堆排序

    1: 怎样形成一个大根堆呢?

        /*
         * heapInsert  将新进来的节点  更新到原来的大堆中。
         * index 节点大于她的父节点 就往上交换, 可能 一直到最大堆的根。
         */
        
        public static void heapInsert(int[] arr, int index){
            while( arr[index] > arr[(index-1)/2]){
                swap(arr, index, (index-1)/2);
                index = (index-1)/2;
            }
        }

    2:当大根堆中某个节点的值变小了,怎么办?

    /*
         * 当最大堆中的某个节点变小了,需要和他的左右孩子比较, 有需要的话要往下沉。
         */
        public static void heapify(int[] arr, int index, int heapsize){
            
            int left = index*2 + 1;
            while( left < heapsize ){
                int largest = left +1 < heapsize && arr[left+1] > arr[left] ? left+1:left;
                largest = arr[index] > arr[largest] ? index:largest;
                
                if( largest == index )
                    break;
                swap(arr, largest, index);
                index = largest;
                left = index*2+1;
            }
        }

    3:堆排序的过程是怎么样的?

    public static void heapSort(int[] arr){
            
            for( int i=0; i<arr.length; ++i)
                HeapSort.heapInsert(arr, i);
            
            int heapsize = arr.length;
            
            while( heapsize > 0 ){
                swap(arr, 0, --heapsize);
                heapify(arr, 0, heapsize);
            }
            
        }
  • 相关阅读:
    第二次博客作业
    C博客作业00--我的第一篇博客
    第1次任务:购物车程序的面向对象设计
    DS博客作业05--查找
    DS博客作业04--图
    DS博客作业03--树
    DS博客作业02--栈和队列
    C博客作业05-指针
    C博客作业04--数组
    C博客作业03--函数
  • 原文地址:https://www.cnblogs.com/lijins/p/10153948.html
Copyright © 2011-2022 走看看