• 堆排序


    又一个高效的排序。

    这个排序算法的基础是大根堆的操作。主要用到的基本操作是将元素下移至适当位置。

    大根堆即根结点大于叶子结点,通过将一个普通数组的元素从底层开始不断向下移到适当位置,即构造完毕。在排序的时候,通过每次将第一个元素与“最后”的元素交换,再将根结点移到适当的位置。需要注意的是,这个“最后”是指每趟排序都压缩数组后的长度。

    另外,由0开始存储元素,左结点是2*i+1,右结点是2*i+2.

    public static void heapSort(int[] A){
        makeHeap(A);
        for(int i = A.length-1; i > 0; i --){
            swap(A, 0, i);
            siftDown(A, i, 0);
        }
    }
    
    private static void siftDown(int[] A, int len, int i){
        while(2*i+1 <= len-1){
            i = 2*i+1;
            if(i+1 <= len-1 && A[i] < A[i+1]) i ++;
            if(A[(i-1)/2] < A[i])
                swap(A, (i-1)/2, i);
            else
                break;
        }
    }
    
    private static void makeHeap(int[] A){
        //max heap
        for(int i = (A.length-1-1)/2; i >= 0; i --){
            siftDown(A, A.length, i);
        }
    }
    Java
  • 相关阅读:
    Android 动画-alpha(渐变透明度动画效果)
    Memento(备忘录)
    Mediator(中介者)
    Iterator(迭代器)
    Command(命令)
    Chain of Responsibility(责任链)
    Template Method(模板方法)
    Interpreter(解释器)
    Proxy(代理)
    Flyweight(享元)
  • 原文地址:https://www.cnblogs.com/7hat/p/3381358.html
Copyright © 2020-2023  润新知