zoukankan      html  css  js  c++  java
  • 极度简化版 HeapSort

    看了网上很多HeapSort版本实现都很复杂,其实HeapSort是完全可以只用一个循环在10行内解决的,先上代码:

    void heapsort(int* array, int size) {
        int top = size;
        int bot = size;
        int cur;
        int nxt = size;
    
        while(cur = nxt, bot > 0) {
            if(cur * 2 + 1 < bot && array[nxt] < array[cur * 2 + 1]) nxt = cur * 2 + 1;
            if(cur * 2 + 2 < bot && array[nxt] < array[cur * 2 + 2]) nxt = cur * 2 + 2;
            if(cur < nxt) {
                std::swap(array[cur], array[nxt]);
            } else {
                nxt = top? --top : (std::swap(array[0], array[--bot]), 0);
            }
        }
        return;
    }
    

     这个实现的原理就是初始让堆顶和堆底都在数组最末尾,然后堆顶首先向前扩展,途中不断做Heapify,在堆顶到达array[0]后整个堆就建好了(其实就是一趟自底向上的O(n)建堆过程)。然后堆底也向前移动,并完成取最大值和重建堆的操作,当堆底也到达array[0]时排序就结束了。

    可见这是一个无删减的HeapSort实现,并且实测中与其它HeapSort相比也没有什么性能损失。 

  • 相关阅读:
    ABC221
    ABC216
    ABC218
    ABC223
    ABC220
    聊聊并发(七)——锁 Craftsman
    (一)推荐阅读 Craftsman
    聊聊并发(五)——线程池 Craftsman
    (二)工作三年的一些感悟 Craftsman
    Java基础(八)——IO流1_字节流、字符流 Craftsman
  • 原文地址:https://www.cnblogs.com/richselian/p/2311837.html
Copyright © 2011-2022 走看看