zoukankan      html  css  js  c++  java
  • 第六章 堆排序

    以后尽量能用迭代就别用递归啊,递归只是让自己轻松了,但是却增加了电脑的负担。

    package chap06_Heap_Sort;
    
    import static org.junit.Assert.*;
    
    import java.util.Arrays;
    
    import org.junit.Test;
    
    public class SortAlorithms {
        /**
         * 返回当前下标下父节点的下标
         * 
         * @param i
         * @return
         */
        protected static int parent(int i) {
            if (i == 0)
                return i;
            return (i - 1) / 2;
        }
    
        /**
         * 返回i的对应左子节点下标
         * 
         * @param i
         * @return
         */
        protected static int left(int i) {
            return 2 * i + 1;
        }
    
        /**
         * 返回i对应右子节点下标
         * 
         * @param i
         * @return
         */
        protected static int right(int i) {
            return 2 * (i + 1);
        }
    
        /**
         * 维护最大堆性质(递归方法实现) 容易内存溢出
         * 
         * @param a
         * @param i
         */
        protected static void maxHeapify1(int[] a, int i, int SIZE) {
            int l = left(i);
            int r = right(i);
            int tmp;
            if (l < SIZE & r < SIZE) {
                if (a[i] >= a[l] & a[i] >= a[r])
                    return;
                else if (a[l] > a[r]) {
                    tmp = a[i];
                    a[i] = a[l];
                    a[l] = tmp;
                    i = l;
                } else {
                    tmp = a[i];
                    a[i] = a[r];
                    a[r] = tmp;
                    i = r;
                }
            } else if (l < SIZE) {
                if (a[i] < a[l]) {
                    tmp = a[i];
                    a[i] = a[l];
                    a[l] = tmp;
                    i = l;
                }
            } else {
                return;
            }
            maxHeapify1(a, i, SIZE);
        }
    
        /**
         * 重建最大堆,从i开始到size(不包含size索引)
         * 
         * @param a
         * @param i
         * @param SIZE
         */
        protected static void maxHeapify(int[] a, int i, int SIZE) {
            int l = left(i);
            int r = right(i);
            int tmp;
            while (l < SIZE & r < SIZE) {
                if (a[i] >= a[l] & a[i] >= a[r])
                    return;
                else if (a[l] > a[r]) {
                    tmp = a[i];
                    a[i] = a[l];
                    a[l] = tmp;
                    i = l;
                } else {
                    tmp = a[i];
                    a[i] = a[r];
                    a[r] = tmp;
                    i = r;
                }
                l = left(i);
                r = right(i);
            }
            if (l < SIZE) {
                if (a[i] < a[l]) {
                    tmp = a[i];
                    a[i] = a[l];
                    a[l] = tmp;
                    i = l;
                }
            }
            return;
        }
    
        /**
         * 将数组a转换成最大堆,不要用递归方法,尽量用迭代方法实现
         * 
         * @param a
         */
        protected static void buildMaxHeap(int[] a) {
            int n = a.length;
    
            for (int i = n / 2; i >= 0; i--) {
                maxHeapify1(a, i, n);
            }
        }
    
        /**
         * 堆排序
         * 
         * @param n
         */
        static void heapSort(int[] n) {
            buildMaxHeap(n);
            int l = n.length;
            int size = l;
            int tmp;
            for (int i = l - 1; i > 0; i--) {
                tmp = n[0];
                n[0] = n[i];
                n[i] = tmp;
                size--;
                maxHeapify(n, 0, size);
            }
        }
    
        @Test
        public void testName() throws Exception {
            // int[] a = { 2, 5, 3, 7, 8, 12, 0, 2, 45, 32 };
            int[] a = { 4, 1, 3, 2, 16, 9, 10, 14, 8, 7 };
            // buildMaxHeap(a);
            // heapSort(a);
            maxHeapify1(a, 0, 10);
            System.out.println(Arrays.toString(a));
        }
    }
  • 相关阅读:
    [MCM] PSO粒子群算法解决TSP问题
    [MCM] 2017研究生数学建模竞赛A题 3架飞机 TSP 求总路径最小
    [tool] AI视频翻译 解决英文视频字幕问题(类似youtube自动生成字幕)
    使用vsnprintf后链接错误及解决方法
    Linux Shell编程
    如何把va_list可变参数传送到下一级函数中(如传送到printf)
    ubuntu phone/touch的源码从哪里下载?
    The Native POSIX Thread Library for Linux
    Linux内核头文件与内核与库的关系
    Buildroot阅读笔记
  • 原文地址:https://www.cnblogs.com/xiaojintao/p/3778975.html
Copyright © 2011-2022 走看看