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

    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]+" ");

    }

     

    }

     

    }

  • 相关阅读:
    搭建App主流框架_纯代码搭建(OC)
    UIApplication,UIWindow,UIViewController,UIView(layer)
    插件类
    VIEWCONTROLLER的启动流程
    UIView你知道多少
    分析UIWindow
    创建控制器的3种方式、深入了解view的创建和加载顺序
    UIViewController的生命周期及iOS程序执行顺序
    ViewController加载顺序与self.view
    GCD
  • 原文地址:https://www.cnblogs.com/superzhaochao/p/6317192.html
Copyright © 2011-2022 走看看