• 堆排序


    tag: 算法基本功 -> 排序 ->堆排序

    堆排序原理:

    所谓堆,是将以数组形式存储的数据结构逻辑上转换成完全二叉树,且对于非叶子节点满足如下定义:

    arrs[i] >= arrs[2 * i + 1];

    arrs[i] >= arrs[2 * i + 2];

    需要调用[arrs.length / 2] 次可以判断是否为堆

    完全二叉树
    一颗深度为k的二叉树,有n个节点,对这颗树进行编号,如果所有的编号跟满二叉树对应,那么这颗树是满二叉树。
    满二叉树: 一个深度为k,节点个数为2^k - 1的二叉树为满二叉树
     

    建堆 -> 调整节点 -> 排序

    package com.zhaochao.search;

     

    /*1.build heap   2.adjust heap  3.heap sort     minimum heap

     * 

     * full binary tree

     * */

    public class HeapSort1 {

     

    //build heap的过程就是从第n/2个数元素到0个元素adjust的过程

     

    public void buildHeap(int[] heap,int size){

     

    if(heap==null||heap.length==0){

    return;

    }

    //int size = heap.length;

    int index = size/2 - 1;

    for(int i = index; i >= 0; i--){

    headAdjust(heap,i,size);

    }

    return;

    }

     

     

    /* 1. 先把root root.left root.right 三者最小值得index求出来

    * 2. 若 root不是最小值,则swap(root,minIndex,size),然后递归 headAdjust(heap,minIndex,size)

    * */

    public void headAdjust(int[] heap,int index,int size){

     

    int left = index * 2 + 1;

    int right = index * 2 + 1;

    int minIndex = index;

     

    if(left < size && heap[minIndex] > heap[left]){

    minIndex = left;

    }

     

    if(right < size && heap[minIndex] > heap[right]){

    minIndex = right;

    }

     

    if(minIndex != index){

    swap(heap,index,minIndex);

    headAdjust(heap,minIndex,size);

    }

     

    return;

     

    }

     

    /* build heap  =>  0与 index-i(i range:1,2,...,index-1) 逐步交换

    * 1.把第0个元素与第n-1个元素swap,然后build第0到第n-2个元素

    * */

    public void heapSort(int[] heap){

     

    int size = heap.length;

    buildHeap(heap,size);

            int index;

            for(index = size - 1; index > 0; index--){

            swap(heap,0,index);

            headAdjust(heap,0,index - 1);

            }

     

    }

     

    public void swap(int[] heap,int indexA,int indexB){

    int tmp = heap[indexA];

    heap[indexA] = heap[indexB];

    heap[indexB] = tmp;

    }

     

    public static void main(String[] args) {

    // TODO Auto-generated method stub

     

           int[] heap = {9,12,17,30,50,20,60,65,4,49};

    HeapSort hs = new HeapSort();

    hs.heapSort(heap, heap.length);

    for(int i = 0; i < heap.length; i++){

    System.out.print(heap[i]+" ");

    }

     

    }

     

    }

  • 相关阅读:
    B+树的Copy-on-Write设计
    so库链接和运行时选择哪个路径下的库?
    Xapian索引-文档检索过程分析之匹配百分比
    Xapian索引-文档检索过程分析
    Xapian的内存索引-添加文档
    Xapian的内存索引
    Xapian使用入门
    一个std::sort 自定义比较排序函数 crash的分析过程
    编译GCC4.8.2
    使用C++11的一点总结
  • 原文地址:https://www.cnblogs.com/superzhaochao/p/6317192.html
Copyright © 2020-2023  润新知