• 堆排序TopK


    package test;
    
    import java.util.Random;
    
    public class TSort {
    
        public static void main(String[] args) {
            TSort tsort = new TSort();
            tsort.test();
        }
    
        public void test() {
            TopHundredHeap.test(null);
        }
    
        public void testt(String a, double[] d, String[] t, String... c) {
            Math.random();
        }
    }
    
    class TopHundredHeap {
    
        public static void test(String[] args) {
            // the size of the array
            int number = 100000000;
            // the top k values
            int k = 100;
            // the range of the values in the array
            int range = 1000000001;
    
            // input for minHeap based method
            int[] array = new int[number];
    
            Random random = new Random();
            for (int i = 0; i < number; i++) {
                array[i] = random.nextInt(range);
            }
    
            TopHundredHeap thh = new TopHundredHeap();
    
            long t1, t2;
            // start time
            t1 = System.currentTimeMillis();
            int[] top = thh.topHundred(array, k);
    
            // end time
            t2 = System.currentTimeMillis();
            System.out.println("The total execution time of " + "quicksort based method is " + (t2 - t1) + " millisecond!");
    
            // print out the top k largest values in the top array
            System.out.println("The top " + k + "largest values are:");
            for (int i = 0; i < k; i++) {
                System.out.println(top[i]);
            }
        }
    
        public int[] topHundred(int[] array, int k) {
            // the heap with size k
            int[] top = new int[k];
    
            for (int i = 0; i < k; i++) {
                top[i] = array[i];
            }
    
            buildMinHeap(top);
    
            for (int i = k; i < array.length; i++) {
                if (top[0] < array[i]) {
                    top[0] = array[i];
                    minHeapify(top, 0, top.length);
                }
            }
    
            return top;
        }
    
        // create a min heap
        public void buildMinHeap(int[] array) {
            int heapSize = array.length;
            for (int i = array.length / 2 - 1; i >= 0; i--) {
                minHeapify(array, i, heapSize);
            }
        }
    
        /// MinHeapify is to build the min heap from the 'position'
        public void minHeapify(int[] array, int position, int heapSize) {
            int left = left(position);
            int right = right(position);
            int maxPosition = position;
    
            if (left < heapSize && array[left] < array[position]) {
                maxPosition = left;
            }
    
            if (right < heapSize && array[right] < array[maxPosition]) {
                maxPosition = right;
            }
    
            if (position != maxPosition) {
                swap(array, position, maxPosition);
                minHeapify(array, maxPosition, heapSize);
            }
        }
    
        public void swap(int[] array, int i, int j) {
            int temp = array[i];
            array[i] = array[j];
            array[j] = temp;
        }
    
        /// return the left child position
        public int left(int i) {
            return 2 * i + 1;
        }
    
        /// return the right child position
        public int right(int i) {
            return 2 * i + 2;
        }
    }
  • 相关阅读:
    Python·安装扩展包的几种方法
    Arduino系列硬件资源介绍
    树莓派USB摄像头的使用
    树莓派frp服务器和客户端配置教程
    树莓派frp内网穿透
    用Windows远程桌面连接树莓派的方法
    控制窗体的位置和大小
    树霉派更换软件镜像源
    I2C的库函数应用示例
    I2C总线的Arduino库函数
  • 原文地址:https://www.cnblogs.com/jpit/p/7375614.html
Copyright © 2020-2023  润新知