博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
堆排序
阅读量:4060 次
发布时间:2019-05-25

本文共 2262 字,大约阅读时间需要 7 分钟。

堆排序分成两个过程

1、构建初始堆(构建初始堆后堆中元素并非有序,只是形成堆,如果是小顶堆的话,堆顶元素是最小的,同时左右子树也是堆。

我之前和那么TOP K 的问题混淆起来了,TOP K的问题是用K个元素建堆,那么堆排序是用多少个元素建堆呢?是用数组的全部元素建堆,然后把堆顶元素放到数组最后,完成一次排序过程,堆尾元素放到堆顶,进行调整。

package Sort;public class HeapSort {    /**     * 建堆函数,建堆函数中用到调整堆函数     * @param array     */    public static void buildHeap(int[] array){        for(int i = (array.length - 2)/2; i >= 0; i--){            adjustHeap(array,i,array.length - 1);        }    }    /**     * 调整堆函数,大根堆     * @param index 调整的树的根节点下标     * @param lastTreeIndex 这个是堆二叉树的最后一个节点的下标,因为我们每进行一次排序,实际上堆就少了一个节点     */    public static void adjustHeap(int[] array, int index,int lastTreeIndex){        //最后一个非叶子节点的下标是(lastTreeIndex - 1)/2;        while(index <= (lastTreeIndex - 1)/2){            int rightIndex = 2*index + 2;//右节点可能不存在            int leftIndex = 2*index + 1;            if(rightIndex > lastTreeIndex){                if(array[index] < array[leftIndex]){                  int tmp = array[index];                  array[index] = array[leftIndex];                  array[leftIndex] = tmp;                  index = leftIndex;                }else{                   break;                }            }else{                int maxValue = 0, maxIndex = 0;                if(array[leftIndex] > array[rightIndex]){                    maxValue = array[leftIndex];                    maxIndex = leftIndex;                }else{                    maxValue = array[rightIndex];                    maxIndex = rightIndex;                }                if(array[index] < maxValue){                    int tmp = array[index];                    array[index] = array[maxIndex];                    array[maxIndex] = tmp;                    index = maxIndex;                }else{                    break;                }            }        }    }    public static void heapSort(int[] array){        buildHeap(array);        for(int i = array.length - 1;i > 0; i--) {            int tmp = array[0];            array[0] = array[i];            array[i] = tmp;            if(i != 1) {                adjustHeap(array, 0, i - 1);//最后一次不能再调整堆了            }        }    }    public static void main(String[] args){        int[] array = {9,67,88,22323,23};        heapSort(array);        ArrayPrint.arrayPrint(array);    }}

 

转载地址:http://xizji.baihongyu.com/

你可能感兴趣的文章
Python报错:UnicodeDecodeError: 'gbk' codec can't decode byte ...
查看>>
C++报错:The build tools for v141 (Platform Toolset = 'v141') cannot be found.
查看>>
Python错误:PyCharm 安装出错 Internal error,please。。。
查看>>
软件架构简介
查看>>
SQL2012报错:cannot find one or more cpmponents
查看>>
关于runat = “server”
查看>>
【opencv实战】图像素描及卡通化
查看>>
【opencv实战】哈哈镜
查看>>
【opencv学习笔记】004之Mat对象及其应用详解
查看>>
C++常用数学函数
查看>>
【积跬步以至千里】Windows无法访问指定设备,路径或文件,您可能没有合适的权限访问
查看>>
【数据结构基础笔记】第一章绪论之基本概念
查看>>
【数据结构基础笔记】第一章绪论之算法及算法分析
查看>>
【数据结构基础笔记】第二章线性表之基本概念与类型定义
查看>>
【数据结构基础笔记】第二章线性表之顺序表
查看>>
C++报错:无法打开文件“路径\Debug\文件名.exe”
查看>>
【数据结构基础笔记】第二章线性表之单链表
查看>>
【积跬步以至千里】Excel行列互换
查看>>
【YOLO学习笔记】之YOLO初体验
查看>>
【YOLO学习笔记】之YOLO配置文件详解
查看>>