algorithm - Build a max heap for an array - Stack Overflow



You're building the tree but you're not adjusting your array. The array reflects the heap structure. The first element being the largest element in the array and the following two elements are the left and right child of that one.

The idea is after you build the heap that you swap the last and the first element in the array and then work on the same array but only using the elements 0 ... array.size - 2. The heap-condition is invalid and you call heapify to get a correct heap structure on the smaller array. This gives you again the largest element in that smaller array at the first position. You swap the first and last element in the smaller array and build the heap on the array which has 2 elements less. But you have two elements at the end which are sorted (the biggest element from the whole array and the next biggest element (which is the biggest element from the first smaller array)). You'll do this until you'll have an rest array which has no elements left.

Take a look at Heap Sort diagram in the german wikipedia. First you'll see the unsorted array. The smaller black box indicates the position in the array. The first tree is a heap.

 Unsorted array   23 | 1 | 6 | 19 | 14 | 18 | 8 | 24 | 15     Heapified Array   24 | 23 | 18 | 19 | 14 | 8 | 6 | 1 | 15     First iteration   Swap First (Biggest Element in Array) with last Element (could be anything)   15 | 23 | 18 | 19 | 14 | 8 | 6 | 1 | 24     heap condition is invalid     Build heap on array.size - 2   23 | 19 | 18 | 15 | 14 | 8 | 6 | 1 || 24     Swap first and last element in smaller heap   1 | 19 | 18 | 15 | 14 | 8 | 6 | 23 || 24     Build heap on array.size - 3   19 | 15 | 18 | 1 | 14 | 8 | 6 || 23 | 24     Swap first and last element on that smaller heap and build heap on array.size - 4   until you cant shrink the heap anymore, you'll receive   || 1 | 8 | 14 | 15 | 18 | 19 | 23 | 24  

The invariant is that your tree is a heap before and after each iteration. That's why it works. Because you'll swap always the largest element to the end of the heapified array.


Read full article from algorithm - Build a max heap for an array - Stack Overflow


No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts