zoukankan      html  css  js  c++  java
  • Java HeapSort

    Java HeapSort

    /**
     * <html>
     * <body>
     *  <P> Copyright 1994-2018 JasonInternational </p>
     *  <p> All rights reserved.</p>
     *  <p> Created on 2018年4月10日 </p>
     *  <p> Created by Jason</p>
     *  </body>
     * </html>
     */
    package cn.ucaner.algorithm.sorts;
    
    /**
     * Heapsort is a comparison-based sorting algorithm to create a sorted array (or
     * list), and is part of the selection sort family. Although somewhat slower in
     * practice on most machines than a well-implemented quicksort, it has the
     * advantage of a more favorable worst-case O(n log n) runtime. 
     * <p>
     * Family: Selection.<br>
     * Space: In-place.<br>
     * Stable: False.<br>
     * <p>
     * Average case = O(n*log n)<br>
     * Worst case = O(n*log n)<br>
     * Best case = O(n*log n)<br>
     * <p>
     * @see <a href="https://en.wikipedia.org/wiki/Heap_sort">Heap Sort (Wikipedia)</a>
     * <br>
     * @author Justin Wetherell <phishman3579@gmail.com>
     */
    public class HeapSort<T extends Comparable<T>> {
    
        private HeapSort() { }
    
        public static <T extends Comparable<T>> T[] sort(T[] unsorted) {
            createHeap(unsorted);
            sortHeap(unsorted);
            return unsorted;
        }
    
        private static <T extends Comparable<T>> void sortHeap(T[] unsorted) {
            int length = unsorted.length;
            for (int index = length - 1; index > 0; index--) {
                swap(0, index, unsorted); // swap root with the last heap element
                int i = 0; // index of the element being moved down the tree
                while (true) {
                    int left = (i * 2) + 1;
                    if (left >= index) // node has no left child
                        break;
                    int right = left + 1;
                    if (right >= index) { // node has a left child, but no right child
                        if (unsorted[left].compareTo(unsorted[i]) > 0)
                            swap(left, i, unsorted); // if left child is greater than node
                        break;
                    }
                    T ithElement = unsorted[i];
                    T leftElement = unsorted[left];
                    T rightElement = unsorted[right];
                    if (ithElement.compareTo(leftElement) < 0) { // (left > i)
                        if (unsorted[left].compareTo(rightElement) > 0) { // (left > right)
                            swap(left, i, unsorted);
                            i = left;
                            continue;
                        } 
                        // (left > i)
                        swap(right, i, unsorted);
                        i = right;
                        continue;
                    } 
                    // (i > left)
                    if (rightElement.compareTo(ithElement) > 0) {
                        swap(right, i, unsorted);
                        i = right;
                        continue;
                    } 
                    // (n > left) & (n > right)
                    break;
                }
            }
        }
    
        private static <T extends Comparable<T>> void createHeap(T[] unsorted) {
            // Creates a max heap
            int size = 0;
            int length = unsorted.length;
            for (int i = 0; i < length; i++) {
                T e = unsorted[i];
                size = add(size, e, unsorted);
            }
        }
    
        private static <T extends Comparable<T>> int add(int size, T element, T[] unsorted) {
            int length = size;
            int i = length;
            unsorted[length++] = element;
            T e = unsorted[i];
            int parentIndex = ((i - 1) / 2);
            T parent = unsorted[parentIndex];
            while (e.compareTo(parent) > 0) {
                swap(parentIndex, i, unsorted);
                i = parentIndex;
                e = unsorted[i];
                parentIndex = ((i - 1) / 2);
                parent = unsorted[parentIndex];
            }
            return length;
        }
    
        private static <T extends Comparable<T>> void swap(int parentIndex, int childIndex, T[] unsorted) {
            T parent = unsorted[parentIndex];
            unsorted[parentIndex] = unsorted[childIndex];
            unsorted[childIndex] = parent;
        }
    }
    

      

  • 相关阅读:
    ajax学习笔记
    CSS3伪类
    《HTML5与CSS3基础教程》学习笔记 ——Four Day
    《HTML5与CSS3基础教程》学习笔记 ——Three Day
    《HTML5与CSS3基础教程》学习笔记 ——Two Day
    《HTML5与CSS3基础教程》学习笔记 ——One Day
    js面向对象笔记
    《锋利的jQuery》心得笔记--Four Sections
    《锋利的jQuery》心得笔记--Three Sections
    《锋利的jQuery》心得笔记--Two Sections
  • 原文地址:https://www.cnblogs.com/jasonandy/p/9243158.html
Copyright © 2011-2022 走看看