图解-堆排序 in-place Heap Sort

川长思鸟来 2022-04-11 04:13 291阅读 0赞

转自:http://www.mathcs.emory.edu/~cheung/Courses/171/Syllabus/9-BinTree/heap-sort2.html

  • Short-coming of the previous “simple” Heap Sort algorithm
  1. * **Consider** the (previously discussed) ***simple* Heap Sort algorithm**:
  2. <table>
  3. <tbody>
  4. <tr>
  5. <td> <pre><span style="color:#0000FF;"><strong> public static void main(String[] args) { Scanner in = new Scanner(System.in); double a[] = {9.2, 4.2, 1.1, 6.4, 3.5, 8.9, 2.5, 7.5}; <span style="color:#FF0000;">// Array 1</span> Heap x = <span style="color:#FF0000;">new Heap( 100 );</span> <span style="color:#FF0000;">// Array 2</span> for ( int i = 0; i &lt; a.length; i++ ) { System.out.println("Insert: " + a[i] ); <span style="color:#FF0000;">x.put( a[i] );</span> x.printHeap(); } System.out.println("\n\nKeep removing the first node : "); for ( int i = 0; i &lt; a.length; i++ ) { double r; r = x.remove(1); System.out.print( r + ", "); } System.out.println(); } </strong></span></pre> </td>
  6. </tr>
  7. </tbody>
  8. </table>
  9. This **algorithm** uses ***2 (two)* arrays**:
  10. <table>
  11. <tbody>
  12. <tr>
  13. <td>
  14. <ul>
  15. <li>The array&nbsp;<strong>a[ ]</strong>&nbsp;to store the&nbsp;<strong>data</strong>&nbsp;that we want to&nbsp;<span style="color:#0000FF;"><strong>sort</strong></span> <p>&nbsp;</p>
  16. <hr><p>&nbsp;</p> </li>
  17. <li>The&nbsp;<span style="color:#FF0000;"><strong><em>Heap</em></strong></span>&nbsp;data structure (that we&nbsp;<span style="color:#0000FF;"><strong>create</strong></span>&nbsp;with the&nbsp;<span style="color:#FF0000;"><strong>new Heap(100)</strong></span>)&nbsp;<strong><em>also</em></strong>&nbsp;uses an&nbsp;<strong>array</strong>&nbsp;!!!</li>
  18. </ul></td>
  19. </tr>
  20. </tbody>
  21. </table>
  22. --------------------
  23. --------------------
  24. * **Idea:**
  25. <table>
  26. <tbody>
  27. <tr>
  28. <td>
  29. <ul>
  30. <li>Can we use the&nbsp;<strong><em>input</em>&nbsp;array</strong>&nbsp;<strong>a[ ]</strong>&nbsp;as a&nbsp;<span style="color:#FF0000;"><strong>Heap</strong></span>&nbsp;??? <p>In other words:</p> <p>&nbsp;</p>
  31. <table>
  32. <tbody>
  33. <tr>
  34. <td>
  35. <ul>
  36. <li>Can we&nbsp;<span style="color:#0000FF;"><strong><em>apply</em></strong></span>&nbsp;the&nbsp;<span style="color:#FF0000;"><strong>heap&nbsp;<em>insert</em>/<em>delete</em>&nbsp;algorithm</strong></span>&nbsp;<strong><em>directly</em></strong>&nbsp;on the&nbsp;<strong>array</strong>&nbsp;<strong>a[ ]</strong>&nbsp;???</li>
  37. </ul></td>
  38. </tr>
  39. </tbody>
  40. </table><p>&nbsp;</p> </li>
  41. </ul></td>
  42. </tr>
  43. </tbody>
  44. </table>
  45. --------------------
  46. --------------------
  47. --------------------
  48. --------------------
  • Input data assumption
  1. * **Facts:**
  2. <table>
  3. <tbody>
  4. <tr>
  5. <td>
  6. <ul>
  7. <li>The&nbsp;<strong><em>input</em>&nbsp;data</strong>&nbsp;that will be&nbsp;<span style="color:#0000FF;"><strong><em>sorted</em></strong></span>&nbsp;are&nbsp;<strong><em>normally</em></strong>&nbsp;stored in an&nbsp;<strong>array</strong>&nbsp;that&nbsp;<span style="color:#FF0000;"><strong><em>starts</em></strong></span>&nbsp;with the&nbsp;<span style="color:#0000FF;"><strong>index 0</strong></span>&nbsp;in&nbsp;<strong>Java</strong> <p>&nbsp;</p>
  8. <hr><p>&nbsp;</p> </li>
  9. <li><span style="color:#FF0000;"><strong>However</strong></span>: <p>&nbsp;</p>
  10. <table>
  11. <tbody>
  12. <tr>
  13. <td>
  14. <ul>
  15. <li>When we&nbsp;<strong>use</strong>&nbsp;an&nbsp;<span style="color:#0000FF;"><strong><em>array</em></strong></span>&nbsp;to&nbsp;<span style="color:#FF0000;"><strong>represent</strong></span>&nbsp;a&nbsp;<strong>Heap</strong>, we&nbsp;<span style="color:#0000FF;"><strong>leave</strong></span>&nbsp;the array element&nbsp;<span style="color:#FF0000;"><strong>a[0]</strong></span>&nbsp;<strong><em>unused</em>&nbsp;(empty)</strong>...</li>
  16. </ul></td>
  17. </tr>
  18. </tbody>
  19. </table><p>&nbsp;</p> </li>
  20. </ul></td>
  21. </tr>
  22. </tbody>
  23. </table>
  24. --------------------
  25. * We **adopt** the following **assumption** on the ***input* data** (that we want to **sort**) in the **Heap Sort** algorithm:
  26. <table>
  27. <tbody>
  28. <tr>
  29. <td>
  30. <ul>
  31. <li>The&nbsp;<strong><em>input</em>&nbsp;data</strong>&nbsp;that will be&nbsp;<span style="color:#0000FF;"><strong><em>sorted</em></strong></span>&nbsp;are stored in an&nbsp;<strong>array</strong>&nbsp;that&nbsp;<span style="color:#FF0000;"><strong><em>starts</em></strong></span>&nbsp;with the&nbsp;<span style="color:#0000FF;"><strong>index 1</strong></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <p>(I.e., the array element&nbsp;<span style="color:#FF0000;"><strong>a[0]</strong></span>&nbsp;is&nbsp;<span style="color:#0000FF;"><strong><em>not</em>&nbsp;used</strong></span>)</p> </li>
  32. </ul></td>
  33. </tr>
  34. </tbody>
  35. </table>
  36. **Example:**
  37. <table>
  38. <tbody>
  39. <tr>
  40. <td>
  41. <ul>
  42. <li>If we want to&nbsp;<span style="color:#0000FF;"><strong>sort</strong></span>&nbsp;the&nbsp;<strong>values</strong>: <p>&nbsp;</p>
  43. <table>
  44. <tbody>
  45. <tr>
  46. <td> <pre><span style="color:#0000FF;"><strong> 9.2, 4.2, 1.1, 6.4, 3.5, 8.9, 2.5, 7.5 </strong></span></pre> </td>
  47. </tr>
  48. </tbody>
  49. </table><p>we will use an&nbsp;<strong>array</strong>&nbsp;with a&nbsp;<span style="color:#FF0000;"><strong><em>dummy</em>&nbsp;value</strong></span>&nbsp;in&nbsp;<span style="color:#0000FF;"><strong>a[0]</strong></span>:</p> <p>&nbsp;</p>
  50. <table>
  51. <tbody>
  52. <tr>
  53. <td> <pre><span style="color:#0000FF;"><strong> double[] a = { <span style="color:#FF0000;">0.0</span>, 9.2, 4.2, 1.1, 6.4, 3.5, 8.9, 2.5, 7.5}; </strong></span></pre> </td>
  54. </tr>
  55. </tbody>
  56. </table><p>&nbsp;</p> </li>
  57. </ul></td>
  58. </tr>
  59. </tbody>
  60. </table>
  61. --------------------
  62. --------------------
  63. --------------------
  64. --------------------
  • Overview of the in-place Heap Sort algorithm
  1. * The ***in-place*** Heap Sort algorithm consists of **2 phases**:
  2. <table>
  3. <tbody>
  4. <tr>
  5. <td>
  6. <ol>
  7. <li><span style="color:#FF0000;"><strong>Heap building (<em>insert</em>)</strong></span>&nbsp;phase: <p>&nbsp;</p>
  8. <table>
  9. <tbody>
  10. <tr>
  11. <td>
  12. <ul>
  13. <li>In this phase, the&nbsp;<span style="color:#0000FF;"><strong><em>input</em>&nbsp;array</strong></span>&nbsp;is&nbsp;<strong>slowly</strong>&nbsp;transformed into a&nbsp;<span style="color:#FF0000;"><strong>Heap</strong></span>&nbsp;--- one&nbsp;<strong>array element</strong>&nbsp;at a time.</li>
  14. </ul></td>
  15. </tr>
  16. </tbody>
  17. </table><p>&nbsp;</p>
  18. <hr><p>&nbsp;</p> </li>
  19. <li><span style="color:#FF0000;"><strong>Heap teardown (<em>delete</em>)</strong></span>&nbsp;phase: <p>&nbsp;</p>
  20. <table>
  21. <tbody>
  22. <tr>
  23. <td>
  24. <ul>
  25. <li>In this phase, the&nbsp;<span style="color:#0000FF;"><strong><em>root</em>&nbsp;node</strong></span>&nbsp;of the&nbsp;<strong>Heap</strong>&nbsp;is&nbsp;<span style="color:#FF0000;"><strong><em>moved</em></strong></span>&nbsp;to the&nbsp;<span style="color:#0000FF;"><strong><em>back</em></strong></span>&nbsp;of the&nbsp;<strong>array</strong>&nbsp;and the&nbsp;<strong>heap</strong>&nbsp;is&nbsp;<span style="color:#0000FF;"><strong>torn down</strong></span>, one&nbsp;<strong>array element</strong>&nbsp;at a time.</li>
  26. </ul></td>
  27. </tr>
  28. </tbody>
  29. </table><p>&nbsp;</p> </li>
  30. </ol></td>
  31. </tr>
  32. </tbody>
  33. </table>
  34. --------------------
  35. --------------------
  36. --------------------
  37. --------------------
  • Heap Sort Phase 1: building an in-place heap
  1. * I will **illustrate** the **Phase 1 algorithm** with an **example**:
  2. <table>
  3. <tbody>
  4. <tr>
  5. <td> <pre><span style="color:#0000FF;"><strong> Input array: a = { <span style="color:#FF0000;">0.0</span>, 9.2, 4.2, 1.1, 6.4, 3.5, 8.9, 2.5, 7.5}; </strong></span></pre> </td>
  6. </tr>
  7. </tbody>
  8. </table>
  9. --------------------
  10. * We ***pretend*** that the ***input* array** is **partitioned** into **2 segments**:
  11. <table>
  12. <tbody>
  13. <tr>
  14. <td>
  15. <ul>
  16. <li>A&nbsp;<span style="color:#0000FF;"><strong><em>heap</em>&nbsp;segment</strong></span>&nbsp;consisting of the&nbsp;<span style="color:#FF0000;"><strong>array elements</strong></span>: <p>&nbsp;</p>
  17. <table>
  18. <tbody>
  19. <tr>
  20. <td> <pre><span style="color:#0000FF;"><strong> a[1] a[2] .... a[k] </strong></span></pre> </td>
  21. </tr>
  22. </tbody>
  23. </table><p>that&nbsp;<strong>form</strong>&nbsp;a&nbsp;<span style="color:#FF0000;"><strong><em>Heap</em></strong></span></p> <p>&nbsp;</p>
  24. <hr><p>&nbsp;</p> </li>
  25. <li>A&nbsp;<span style="color:#FF0000;"><strong><em>unprocessed</em>&nbsp;segment</strong></span>&nbsp;of&nbsp;<span style="color:#0000FF;"><strong><em>unprocessed</em>&nbsp;array elements</strong></span>: <p>&nbsp;</p>
  26. <table>
  27. <tbody>
  28. <tr>
  29. <td> <pre><span style="color:#0000FF;"><strong> a[k+1] a[k+2] .... a[N] </strong></span></pre> </td>
  30. </tr>
  31. </tbody>
  32. </table><p>&nbsp;</p> </li>
  33. </ul></td>
  34. </tr>
  35. </tbody>
  36. </table>
  37. --------------------
  38. * ***Initially***, the ***heap* segments** consists of ***only*** one array element (**a\[0\]**):
  39. <table>
  40. <tbody>
  41. <tr>
  42. <td><img alt="" src="http://www.mathcs.emory.edu/~cheung/Courses/171/Syllabus/9-BinTree/FIGS/HeapSort01.gif"></td>
  43. </tr>
  44. </tbody>
  45. </table>
  46. --------------------
  47. --------------------
  48. * I will now do a **few** ***iterations*** of the **Phase 1 algorithm**:
  49. <table>
  50. <tbody>
  51. <tr>
  52. <td>
  53. <ul>
  54. <li><strong>Iteration 1:</strong> <p>&nbsp;</p>
  55. <table>
  56. <tbody>
  57. <tr>
  58. <td>
  59. <ul>
  60. <li><strong>Step 1:</strong>&nbsp;<span style="color:#0000FF;"><strong>add</strong></span>&nbsp;the&nbsp;<span style="color:#FF0000;"><strong>next array element (a[2] = 4.2)</strong></span>&nbsp;to the&nbsp;<strong>Heap</strong> <p>&nbsp;</p>
  61. <table>
  62. <tbody>
  63. <tr>
  64. <td><img alt="" src="http://www.mathcs.emory.edu/~cheung/Courses/171/Syllabus/9-BinTree/FIGS/HeapSort02.gif"></td>
  65. </tr>
  66. </tbody>
  67. </table><p>&nbsp;</p>
  68. <hr><p>&nbsp;</p> </li>
  69. <li><strong>Step 2:</strong>&nbsp;<span style="color:#0000FF;"><strong><em>Filter</em>&nbsp;</strong></span>the&nbsp;<span style="color:#FF0000;"><strong><em>newly added</em>&nbsp;next array element (a[2] = 4.2)</strong></span>&nbsp;<span style="color:#0000FF;"><strong>up</strong></span>&nbsp;into the&nbsp;<strong>Heap</strong> <p>&nbsp;</p>
  70. <table>
  71. <tbody>
  72. <tr>
  73. <td><img alt="" src="http://www.mathcs.emory.edu/~cheung/Courses/171/Syllabus/9-BinTree/FIGS/HeapSort03.gif"></td>
  74. </tr>
  75. </tbody>
  76. </table><p>&nbsp;</p> </li>
  77. </ul></td>
  78. </tr>
  79. </tbody>
  80. </table><p>&nbsp;</p>
  81. <hr>
  82. <hr><p>&nbsp;</p> </li>
  83. <li><strong>Iteration 2:</strong> <p>&nbsp;</p>
  84. <table>
  85. <tbody>
  86. <tr>
  87. <td>
  88. <ul>
  89. <li><strong>Step 1:</strong>&nbsp;<span style="color:#0000FF;"><strong>add</strong></span>&nbsp;the&nbsp;<span style="color:#FF0000;"><strong>next array element (a[3] = 1.1)</strong></span>&nbsp;to the&nbsp;<strong>Heap</strong> <p>&nbsp;</p>
  90. <table>
  91. <tbody>
  92. <tr>
  93. <td><img alt="" src="http://www.mathcs.emory.edu/~cheung/Courses/171/Syllabus/9-BinTree/FIGS/HeapSort04.gif"></td>
  94. </tr>
  95. </tbody>
  96. </table><p>&nbsp;</p>
  97. <hr><p>&nbsp;</p> </li>
  98. <li><strong>Step 2:</strong>&nbsp;<span style="color:#0000FF;"><strong><em>Filter</em>&nbsp;</strong></span>the&nbsp;<span style="color:#FF0000;"><strong><em>newly added</em>&nbsp;next array element (a[3] = 1.1)</strong></span>&nbsp;<span style="color:#0000FF;"><strong>up</strong></span>&nbsp;into the&nbsp;<strong>Heap</strong> <p>&nbsp;</p>
  99. <table>
  100. <tbody>
  101. <tr>
  102. <td><img alt="" src="http://www.mathcs.emory.edu/~cheung/Courses/171/Syllabus/9-BinTree/FIGS/HeapSort05.gif"></td>
  103. </tr>
  104. </tbody>
  105. </table><p>&nbsp;</p> </li>
  106. </ul></td>
  107. </tr>
  108. </tbody>
  109. </table><p>&nbsp;</p>
  110. <hr>
  111. <hr><p>&nbsp;</p> </li>
  112. <li>One more and I will stop,&nbsp;<strong>Iteration 3:</strong> <p>&nbsp;</p>
  113. <table>
  114. <tbody>
  115. <tr>
  116. <td>
  117. <ul>
  118. <li><strong>Step 1:</strong>&nbsp;<span style="color:#0000FF;"><strong>add</strong></span>&nbsp;the&nbsp;<span style="color:#FF0000;"><strong>next array element (a[4] = 6.4)</strong></span>&nbsp;to the&nbsp;<strong>Heap</strong> <p>&nbsp;</p>
  119. <table>
  120. <tbody>
  121. <tr>
  122. <td><img alt="" src="http://www.mathcs.emory.edu/~cheung/Courses/171/Syllabus/9-BinTree/FIGS/HeapSort06.gif"></td>
  123. </tr>
  124. </tbody>
  125. </table><p>&nbsp;</p>
  126. <hr><p>&nbsp;</p> </li>
  127. <li><strong>Step 2:</strong>&nbsp;<span style="color:#0000FF;"><strong><em>Filter</em>&nbsp;</strong></span>the&nbsp;<span style="color:#FF0000;"><strong><em>newly added</em>&nbsp;next array element (a[4] = 6.4)</strong></span>&nbsp;<span style="color:#0000FF;"><strong>up</strong></span>&nbsp;into the&nbsp;<strong>Heap</strong> <p>&nbsp;</p>
  128. <table>
  129. <tbody>
  130. <tr>
  131. <td><img alt="" src="http://www.mathcs.emory.edu/~cheung/Courses/171/Syllabus/9-BinTree/FIGS/HeapSort07.gif"></td>
  132. </tr>
  133. </tbody>
  134. </table><p>&nbsp;</p> </li>
  135. </ul></td>
  136. </tr>
  137. </tbody>
  138. </table><p>&nbsp;</p> </li>
  139. </ul></td>
  140. </tr>
  141. </tbody>
  142. </table>
  143. --------------------
  144. --------------------
  145. --------------------
  146. * The ***Phase 1* **of the **Heap Sort** algorithm:
  147. <table>
  148. <tbody>
  149. <tr>
  150. <td> <pre><span style="color:#0000FF;"><strong> // Initially: heap segment = {a[1]} for ( every element x = a[2], a[3], a[4], .... ) { "Include x into the Heap;" // We don't need to do anything !!! // We just pretend the heap segment // has expanded by 1 array element <span style="color:#FF0000;">filter x up the heap;</span> } </strong></span></pre> </td>
  151. </tr>
  152. </tbody>
  153. </table>
  154. --------------------
  155. --------------------
  156. * The ***Phase 1* algorithm** in **Java**:
  157. <table>
  158. <tbody>
  159. <tr>
  160. <td> <pre><span style="color:#0000FF;"><strong> NNodes = 1; // Start the Heap with a[1] for (i = 2; i &lt; a.length; i++) { <span style="color:#FF0000;"><strong>NNodes++;</strong></span><strong> // "Include" the next node <span style="color:#FF0000;">HeapFilterUp(a, NNodes);</span> // Filter a[NNodes] up the heap. } </strong></strong></span></pre> </td>
  161. </tr>
  162. </tbody>
  163. </table>
  164. --------------------
  165. --------------------
  166. --------------------
  167. --------------------
  • The result of the Phase 1 algorithm
  1. * **Fact:**
  2. <table>
  3. <tbody>
  4. <tr>
  5. <td>
  6. <ul>
  7. <li>When&nbsp;<span style="color:#0000FF;"><strong><em>Phase 1</em></strong></span>&nbsp;of the&nbsp;<strong>Heap Sort</strong>&nbsp;algorithm&nbsp;<span style="color:#FF0000;"><strong>completes</strong></span>, the&nbsp;<span style="color:#0000FF;"><strong><em>input</em>&nbsp;array (a[ ])</strong></span>&nbsp;will be&nbsp;<strong>transformed</strong>&nbsp;into a&nbsp;<span style="color:#FF0000;"><strong><em>Heap</em></strong></span></li>
  8. </ul></td>
  9. </tr>
  10. </tbody>
  11. </table>
  12. --------------------
  13. * **Example:**
  14. <table>
  15. <tbody>
  16. <tr>
  17. <td>
  18. <ul>
  19. <li>Initial&nbsp;<span style="color:#0000FF;"><strong><em>input</em>&nbsp;array</strong></span>: <p>&nbsp;</p>
  20. <table>
  21. <tbody>
  22. <tr>
  23. <td><img alt="" src="http://www.mathcs.emory.edu/~cheung/Courses/171/Syllabus/9-BinTree/FIGS/HeapSort01.gif"></td>
  24. </tr>
  25. </tbody>
  26. </table><p>&nbsp;</p>
  27. <hr><p>&nbsp;</p> </li>
  28. <li>When&nbsp;<span style="color:#0000FF;"><strong>phase 1</strong></span>&nbsp;completes, the&nbsp;<span style="color:#FF0000;"><strong>input array</strong></span>&nbsp;will be a&nbsp;<strong>Heap</strong>: <p>&nbsp;</p>
  29. <table>
  30. <tbody>
  31. <tr>
  32. <td><img alt="" src="http://www.mathcs.emory.edu/~cheung/Courses/171/Syllabus/9-BinTree/FIGS/HeapSort08.gif"></td>
  33. </tr>
  34. </tbody>
  35. </table><p>&nbsp;</p> </li>
  36. </ul></td>
  37. </tr>
  38. </tbody>
  39. </table>
  40. --------------------
  41. --------------------
  42. --------------------
  43. --------------------
  44. --------------------
  45. --------------------
  46. --------------------
  47. --------------------
  • Heap Sort Pase 2: tearing down the in-place heap
  1. * In **Phase 2**, we ***repeatedly* remove** the **root node** of the (in-place) **heap**
  2. <table>
  3. <tbody>
  4. <tr>
  5. <td>
  6. <ul>
  7. <li>The&nbsp;<span style="color:#0000FF;"><strong><em>root</em>&nbsp;node</strong></span>&nbsp;of the&nbsp;<strong>Heap</strong>&nbsp;is (always) stored in the&nbsp;<span style="color:#FF0000;"><strong>array element&nbsp;a[1]</strong></span> <p><strong>Example:</strong></p> <p>&nbsp;</p>
  8. <table>
  9. <tbody>
  10. <tr>
  11. <td><strong><strong><img alt="" src="http://www.mathcs.emory.edu/~cheung/Courses/171/Syllabus/9-BinTree/FIGS/HeapSort09.gif"></strong></strong></td>
  12. </tr>
  13. </tbody>
  14. </table><p>&nbsp;</p> </li>
  15. </ul></td>
  16. </tr>
  17. </tbody>
  18. </table>
  19. --------------------
  20. * **Recall:**
  21. <table>
  22. <tbody>
  23. <tr>
  24. <td>
  25. <ul>
  26. <li>When we&nbsp;<span style="color:#0000FF;"><strong>delete</strong></span>&nbsp;a&nbsp;<span style="color:#FF0000;"><strong>node</strong></span>&nbsp;from the&nbsp;<strong>Heap</strong>, we must&nbsp;<span style="color:#0000FF;"><strong>first</strong></span>: <p>&nbsp;</p>
  27. <table>
  28. <tbody>
  29. <tr>
  30. <td>
  31. <ul>
  32. <li><span style="color:#FF0000;"><strong><em>Replace</em></strong></span>&nbsp;the&nbsp;<strong>deleted node</strong>&nbsp;with the&nbsp;<span style="color:#0000FF;"><strong><em>right-most</em>&nbsp;leaf node</strong></span>&nbsp;in the&nbsp;<span style="color:#FF0000;"><strong><em>lowest</em>&nbsp;level</strong></span></li>
  33. </ul></td>
  34. </tr>
  35. </tbody>
  36. </table><p><strong>Example:</strong></p> <p>&nbsp;</p>
  37. <table>
  38. <tbody>
  39. <tr>
  40. <td>
  41. <ul>
  42. <li><strong><strong>When we&nbsp;<span style="color:#0000FF;"><strong>delete</strong></span>&nbsp;the&nbsp;<span style="color:#FF0000;"><strong>root node 1.1</strong></span>:</strong></strong> <p>&nbsp;</p>
  43. <table>
  44. <tbody>
  45. <tr>
  46. <td><strong><strong><img alt="" src="http://www.mathcs.emory.edu/~cheung/Courses/171/Syllabus/9-BinTree/FIGS/HeapSort10.gif"></strong></strong></td>
  47. </tr>
  48. </tbody>
  49. </table><p>&nbsp;</p>
  50. <hr><p>&nbsp;</p> </li>
  51. <li><strong><strong>We&nbsp;<strong>first</strong>&nbsp;replace the&nbsp;<span style="color:#0000FF;"><strong>root node</strong></span>&nbsp;with the&nbsp;<span style="color:#FF0000;"><strong>node 6.4</strong></span>:</strong></strong> <p>&nbsp;</p>
  52. <table>
  53. <tbody>
  54. <tr>
  55. <td><strong><strong><img alt="" src="http://www.mathcs.emory.edu/~cheung/Courses/171/Syllabus/9-BinTree/FIGS/HeapSort11.gif"></strong></strong></td>
  56. </tr>
  57. </tbody>
  58. </table><p>&nbsp;</p> </li>
  59. </ul></td>
  60. </tr>
  61. </tbody>
  62. </table><p>&nbsp;</p> </li>
  63. </ul></td>
  64. </tr>
  65. </tbody>
  66. </table>
  67. --------------------
  68. --------------------
  69. * The **Heap *deletion* algorithm** will then use the **filter *down*** algorithm to transform the **tree** into a **Heap**
  70. (Remember that in a **Heap**, the ***root* node** of ***each* subtree** must have the ***smallest* value** in its **subtree** -
  71. The **filter *down*** algorithm will **fix** the **tree** to **comply** with this **property**)
  72. <table>
  73. <tbody>
  74. <tr>
  75. <td>
  76. <ul>
  77. <li>We can (and will)&nbsp;<span style="color:#0000FF;"><strong>apply</strong></span>&nbsp;the&nbsp;<span style="color:#FF0000;"><strong>filter&nbsp;<em>down</em></strong></span>&nbsp;algorithm to&nbsp;<strong>fix</strong>&nbsp;the&nbsp;<span style="color:#0000FF;"><strong>tree</strong></span>... <p>(We will discuss that later...)</p> <p><span style="color:#FF0000;"><strong>But&nbsp;<em>more importantly</em></strong></span>, notice that:</p> <p>&nbsp;</p>
  78. <table>
  79. <tbody>
  80. <tr>
  81. <td><img alt="" src="http://www.mathcs.emory.edu/~cheung/Courses/171/Syllabus/9-BinTree/FIGS/HeapSort11.gif"></td>
  82. </tr>
  83. </tbody>
  84. </table><p>The&nbsp;<span style="color:#0000FF;"><strong>array</strong></span>&nbsp;has a&nbsp;<span style="color:#FF0000;"><strong><em>empty</em>&nbsp;slot</strong></span>&nbsp;at the&nbsp;<span style="color:#0000FF;"><strong>end</strong></span>&nbsp;!!!</p> <p>&nbsp;</p>
  85. <table>
  86. <tbody>
  87. <tr>
  88. <td>
  89. <ul>
  90. <li>We can&nbsp;<strong>use</strong>&nbsp;this&nbsp;<span style="color:#0000FF;"><strong><em>empty</em>&nbsp;slot</strong></span>&nbsp;to&nbsp;<strong>store</strong>&nbsp;the&nbsp;<span style="color:#FF0000;"><strong><em>deleted</em>&nbsp;value (1.1)</strong></span>&nbsp;!!! <p>(This&nbsp;<strong>trick</strong>&nbsp;makes the&nbsp;<strong>Heap Sort</strong>&nbsp;algorithm an&nbsp;<span style="color:#FF0000;"><strong><em>in-place</em>&nbsp;algorithm</strong></span>&nbsp;--- we don't need another array !!!)</p> </li>
  91. </ul></td>
  92. </tr>
  93. </tbody>
  94. </table><p>&nbsp;</p> </li>
  95. </ul></td>
  96. </tr>
  97. </tbody>
  98. </table>
  99. --------------------
  100. --------------------
  101. --------------------
  102. * This is what I mean:
  103. <table>
  104. <tbody>
  105. <tr>
  106. <td>
  107. <ul>
  108. <li>We&nbsp;<strong>store</strong>&nbsp;the&nbsp;<span style="color:#FF0000;"><strong>deleted value</strong></span>&nbsp;into the&nbsp;<span style="color:#0000FF;"><strong><em>empty</em>&nbsp;slot</strong></span>&nbsp;created by the&nbsp;<span style="color:#FF0000;"><strong><em>replacement</em>&nbsp;step</strong></span>&nbsp;of the&nbsp;<span style="color:#0000FF;"><strong>Heap deletion algorithm</strong></span>: <p>&nbsp;</p>
  109. <table>
  110. <tbody>
  111. <tr>
  112. <td><img alt="" src="http://www.mathcs.emory.edu/~cheung/Courses/171/Syllabus/9-BinTree/FIGS/HeapSort12.gif"></td>
  113. </tr>
  114. </tbody>
  115. </table><p>&nbsp;</p> </li>
  116. </ul></td>
  117. </tr>
  118. </tbody>
  119. </table>
  120. --------------------
  121. --------------------
  122. * Now we perform the **filter *down*** algorithm to **fix** the **Heap**:
  123. <table>
  124. <tbody>
  125. <tr>
  126. <td>
  127. <ul>
  128. <li>Initially: <p>&nbsp;</p>
  129. <table>
  130. <tbody>
  131. <tr>
  132. <td><img alt="" src="http://www.mathcs.emory.edu/~cheung/Courses/171/Syllabus/9-BinTree/FIGS/HeapSort13.gif"></td>
  133. </tr>
  134. </tbody>
  135. </table><p>&nbsp;</p>
  136. <hr><p>&nbsp;</p> </li>
  137. <li><span style="color:#FF0000;"><strong>Filter down</strong></span>:&nbsp;<span style="color:#0000FF;"><strong>swap</strong></span>&nbsp;with the&nbsp;<span style="color:#FF0000;"><strong><em>smallest</em>&nbsp;child node</strong></span> <p>&nbsp;</p>
  138. <table>
  139. <tbody>
  140. <tr>
  141. <td><img alt="" src="http://www.mathcs.emory.edu/~cheung/Courses/171/Syllabus/9-BinTree/FIGS/HeapSort13a.gif"></td>
  142. </tr>
  143. </tbody>
  144. </table><p><strong>Result:</strong></p> <p>&nbsp;</p>
  145. <table>
  146. <tbody>
  147. <tr>
  148. <td><img alt="" src="http://www.mathcs.emory.edu/~cheung/Courses/171/Syllabus/9-BinTree/FIGS/HeapSort13b.gif"></td>
  149. </tr>
  150. </tbody>
  151. </table><p>&nbsp;</p>
  152. <hr>
  153. <hr><p>&nbsp;</p> </li>
  154. <li>Since&nbsp;<span style="color:#FF0000;"><strong>6.4</strong></span>&nbsp;is&nbsp;<span style="color:#0000FF;"><strong><em>smaller</em></strong></span>&nbsp;than its&nbsp;<span style="color:#FF0000;"><strong><em>children nodes</em>&nbsp;(9.2 and 7.5)</strong></span>, we have a&nbsp;<strong>Heap</strong>&nbsp;again.</li>
  155. </ul></td>
  156. </tr>
  157. </tbody>
  158. </table>
  159. --------------------
  160. --------------------
  161. * I will now do ***one* more** **iteration** of the **Phase 2** algorithm (starting with the last result):
  162. <table>
  163. <tbody>
  164. <tr>
  165. <td>
  166. <ul>
  167. <li><strong>Iteration 2:</strong>&nbsp;(the previous iteration was the first iteration !) <p>&nbsp;</p>
  168. <table>
  169. <tbody>
  170. <tr>
  171. <td>
  172. <ul>
  173. <li><strong>Initially:</strong> <p>&nbsp;</p>
  174. <table>
  175. <tbody>
  176. <tr>
  177. <td><img alt="" src="http://www.mathcs.emory.edu/~cheung/Courses/171/Syllabus/9-BinTree/FIGS/HeapSort14.gif"></td>
  178. </tr>
  179. </tbody>
  180. </table><p>&nbsp;</p>
  181. <hr><p>&nbsp;</p> </li>
  182. <li><span style="color:#0000FF;"><strong>Delete</strong></span>&nbsp;the&nbsp;<span style="color:#FF0000;"><strong><em>root</em>&nbsp;node (a[1])</strong></span>: <p>&nbsp;</p>
  183. <table>
  184. <tbody>
  185. <tr>
  186. <td><img alt="" src="http://www.mathcs.emory.edu/~cheung/Courses/171/Syllabus/9-BinTree/FIGS/HeapSort14a.gif"></td>
  187. </tr>
  188. </tbody>
  189. </table><p>(We&nbsp;<span style="color:#0000FF;"><strong>save</strong></span>&nbsp;the&nbsp;<strong>deleted value</strong>&nbsp;in a&nbsp;<span style="color:#FF0000;"><strong><em>help</em>&nbsp;variable</strong></span>)</p> <p>&nbsp;</p>
  190. <hr><p>&nbsp;</p> </li>
  191. <li><span style="color:#0000FF;"><strong>Replace</strong></span>&nbsp;the&nbsp;<span style="color:#FF0000;"><strong><em>root</em>&nbsp;node</strong></span>&nbsp;with the&nbsp;<span style="color:#0000FF;"><strong><em>fartest</em>&nbsp;right node</strong></span>&nbsp;on the&nbsp;<strong>lowest levl</strong>: <p>&nbsp;</p>
  192. <table>
  193. <tbody>
  194. <tr>
  195. <td><img alt="" src="http://www.mathcs.emory.edu/~cheung/Courses/171/Syllabus/9-BinTree/FIGS/HeapSort14b.gif"></td>
  196. </tr>
  197. </tbody>
  198. </table><p>(We&nbsp;<span style="color:#0000FF;"><strong>save</strong></span>&nbsp;the&nbsp;<strong>deleted value</strong>&nbsp;in a&nbsp;<span style="color:#FF0000;"><strong><em>help</em>&nbsp;variable</strong></span>)</p> <p>&nbsp;</p>
  199. <hr><p>&nbsp;</p> </li>
  200. <li><span style="color:#0000FF;"><strong>Save</strong></span>&nbsp;the&nbsp;<span style="color:#FF0000;"><strong><em>deleted</em>&nbsp;value</strong></span>&nbsp;in the&nbsp;<span style="color:#0000FF;"><strong><em>empty</em>&nbsp;slot</strong></span>: (this slot is&nbsp;<span style="color:#0000FF;"><strong><em>not</em></strong></span>&nbsp;part of the&nbsp;<strong>Heap</strong>&nbsp;!!!) <p>&nbsp;</p>
  201. <table>
  202. <tbody>
  203. <tr>
  204. <td><img alt="" src="http://www.mathcs.emory.edu/~cheung/Courses/171/Syllabus/9-BinTree/FIGS/HeapSort14c.gif"></td>
  205. </tr>
  206. </tbody>
  207. </table><p>&nbsp;</p>
  208. <hr><p>&nbsp;</p> </li>
  209. <li><span style="color:#0000FF;"><strong>Fix</strong></span>&nbsp;the&nbsp;<span style="color:#FF0000;"><strong><em>Heap</em>&nbsp;</strong></span>using the&nbsp;<span style="color:#0000FF;"><strong>filter&nbsp;<em>down</em>&nbsp;algorithm</strong></span>: <p><span style="color:#0000FF;"><strong>Exchange</strong></span>&nbsp;the&nbsp;<strong>replacement node</strong>&nbsp;with its&nbsp;<span style="color:#FF0000;"><strong><em>smallest</em>&nbsp;child</strong></span>:</p> <p>&nbsp;</p>
  210. <table>
  211. <tbody>
  212. <tr>
  213. <td><img alt="" src="http://www.mathcs.emory.edu/~cheung/Courses/171/Syllabus/9-BinTree/FIGS/HeapSort14d.gif"></td>
  214. </tr>
  215. </tbody>
  216. </table><p><strong>Result:</strong></p> <p>&nbsp;</p>
  217. <table>
  218. <tbody>
  219. <tr>
  220. <td><img alt="" src="http://www.mathcs.emory.edu/~cheung/Courses/171/Syllabus/9-BinTree/FIGS/HeapSort14e.gif"></td>
  221. </tr>
  222. </tbody>
  223. </table><p>&nbsp;</p> <p><span style="color:#0000FF;"><strong>Exchange&nbsp;<em>again</em></strong></span>: (because one of its child node is&nbsp;<strong><em>smaller</em></strong>)</p> <p>&nbsp;</p>
  224. <table>
  225. <tbody>
  226. <tr>
  227. <td><img alt="" src="http://www.mathcs.emory.edu/~cheung/Courses/171/Syllabus/9-BinTree/FIGS/HeapSort14f.gif"></td>
  228. </tr>
  229. </tbody>
  230. </table><p><strong>Result:</strong></p> <p>&nbsp;</p>
  231. <table>
  232. <tbody>
  233. <tr>
  234. <td><img alt="" src="http://www.mathcs.emory.edu/~cheung/Courses/171/Syllabus/9-BinTree/FIGS/HeapSort14g.gif"></td>
  235. </tr>
  236. </tbody>
  237. </table><p>&nbsp;</p> </li>
  238. </ul></td>
  239. </tr>
  240. </tbody>
  241. </table><p>&nbsp;</p> <p>&nbsp;</p> </li>
  242. </ul></td>
  243. </tr>
  244. </tbody>
  245. </table>
  246. --------------------
  247. --------------------
  248. * **Notice that**:
  249. <table>
  250. <tbody>
  251. <tr>
  252. <td>
  253. <ul>
  254. <li>The&nbsp;<span style="color:#0000FF;"><strong>value</strong></span>&nbsp;is&nbsp;<span style="color:#FF0000;"><strong>sorted&nbsp;<em>backwards</em></strong></span>&nbsp;in the&nbsp;<strong>back</strong>&nbsp;of the&nbsp;<span style="color:#0000FF;"><strong>array&nbsp;</strong></span>!!! <p><strong>Example:</strong></p> <p>&nbsp;</p>
  255. <table>
  256. <tbody>
  257. <tr>
  258. <td><img alt="" src="http://www.mathcs.emory.edu/~cheung/Courses/171/Syllabus/9-BinTree/FIGS/HeapSort15.gif"></td>
  259. </tr>
  260. </tbody>
  261. </table><p>&nbsp;</p> </li>
  262. </ul></td>
  263. </tr>
  264. </tbody>
  265. </table>
  266. --------------------
  267. --------------------
  268. * **Phase 2 algorithm** in **Pseudo code**:
  269. <table>
  270. <tbody>
  271. <tr>
  272. <td> <pre><span style="color:#0000FF;"><strong> repeat these step N times (N = # nodes in the heap) { help = a[1]; // <span style="color:#FF0000;">Delete the root node</span> and save the value a[1] = a[last node in heap]; // <span style="color:#FF0000;">Replace root node</span> with // fartest right node on lowest level a[empty slot] = help; // <span style="color:#FF0000;">Save deleted value</span> in empty slot HeapFilterUp( 1 ); // <span style="color:#FF0000;">Fix the heap</span> start at root node } // Optionally, we can <span style="color:#FF0000;">reverse</span> the // array elements (because the values are sorted in reverse order) </strong></span></pre> </td>
  273. </tr>
  274. </tbody>
  275. </table>
  276. --------------------
  277. --------------------
  278. * **Phase 2 algorithm** in **Java**:
  279. <table>
  280. <tbody>
  281. <tr>
  282. <td> <pre><span style="color:#0000FF;"><strong> for ( i = 1; i &lt; a.length; i++ ) { help = a[1]; // <span style="color:#FF0000;">Delete root node</span> a[1] = a[NNodes]; // <span style="color:#FF0000;">Replace root node with the last node</span> a[NNodes] = help; // <span style="color:#FF0000;">Put the deleted node in the empty slot<span style="color:#0000FF;"> NNodes--; // <span style="color:#FF0000;">One less node in Heap </span> HeapFilterDown(a, 1, NNodes); // <span style="color:#FF0000;">Fix the Heap</span> } /* ========================================================= This for-loop reverse the elements a[1] a[2] ... a[N] ========================================================= */ for ( i = 1, j = a.length-1; i &lt; j; i++, j-- ) { help = a[i]; a[i] = a[j]; a[j] = help; } </span></span></strong></span></pre> </td>
  283. </tr>
  284. </tbody>
  285. </table>
  286. --------------------
  287. --------------------
  288. --------------------
  289. --------------------
  • The complete Heap Sort algorithm
  1. * Putting **phase 1** and **phase 2** into the **sort** method yields the following code:
  2. <table>
  3. <tbody>
  4. <tr>
  5. <td> <pre><strong><span style="color:#0000FF;"> public static void <span style="color:#FF0000;">sort( double[] a )</span> { int i, j, NNodes; double help; <span style="color:#FF0000;"> /* ======================================= Phase 1 ======================================= */</span> <span style="color:#FF0000;">NNodes = 1;</span> for (i = 2; i &lt; a.length; i++) { <span style="color:#FF0000;">NNodes++;</span> // include next node HeapFilterUp(a, NNodes); printHeap(a, NNodes); } <span style="color:#FF0000;"> /* ======================================= Phase 2 ======================================= */</span> for ( i = 1; i &lt; a.length; i++ ) { help = a[1]; // Delete root node a[1] = a[NNodes]; // Replace root node with the last node a[NNodes] = help; // Put the deleted node in the empty slot <span style="color:#FF0000;">NNodes--;</span> // One less node in Heap HeapFilterDown(a, 1, NNodes); // Fix the Heap printHeap(a, NNodes); } </span>
  6. /* =======================================
  7. Reverse the (sorted) array
  8. ======================================= */
  9. for ( i = 1, j = a.length-1; i &lt; j; i++, j-- )
  10. {
  11. help = a[i];
  12. a[i] = a[j];
  13. a[j] = help;
  14. }
  15. }
  16. </strong></pre> </td>
  17. </tr>
  18. </tbody>
  19. </table>
  20. --------------------
  21. --------------------
  22. * The **Filter Up** method has been **changed** a **little** (because we must **pass** the **array** as a **parameter**)
  23. <table>
  24. <tbody>
  25. <tr>
  26. <td> <pre><span style="color:#0000FF;"><strong> The array <span style="color:#FF0000;">a</span> is passed as parameter The parameter <span style="color:#FF0000;">k</span> also to tell the method how many nodes there are in the Heap public static void HeapFilterUp( <span style="color:#FF0000;">double[] a</span>, int k ) { **** The BODY of the method is UNCHANGED !!!! **** } </strong></span></pre> </td>
  27. </tr>
  28. </tbody>
  29. </table>
  30. (The ***algorithm*** did ***not*** change. --- that's why I **did *not*** include the ***body***)
  31. Only the ***way*** that the **array** is **given** to the **method** was **changed**
  32. This change does ***not*** (and **should** ***not***) affect you **understanding** of the **algorithm** !!!)
  33. --------------------
  34. --------------------
  35. * The **Filter Down** method is ***also*** change a **little bit** due to the way the **parameters** are **passed**:
  36. <table>
  37. <tbody>
  38. <tr>
  39. <td> <pre><span style="color:#0000FF;"><strong> The array <span style="color:#FF0000;">a</span> is passed as parameter The parameter <span style="color:#FF0000;">NNodes</span> is also needed to tell the method how many nodes there are in the Heap (k is the index of the delete location) public static void HeapFilterDown( <span style="color:#FF0000;">double[] a</span>, int k, <span style="color:#FF0000;">int NNodes</span> ) { **** The BODY of the method is UNCHANGED !!!! **** } </strong></span></pre> </td>
  40. </tr>
  41. </tbody>
  42. </table>
  43. --------------------
  44. --------------------
  45. * Here is a **test program** for the **Heap Sort** method:
  46. <table>
  47. <tbody>
  48. <tr>
  49. <td> <pre><span style="color:#0000FF;"><strong> public static void main( String[] args ) { double[] x = { <span style="color:#FF0000;">0,</span> 6.4, 2.5, 9.2, 3.5, 8.9, 1.1, 7.5, 4.2} ; System.out.println("Before sort: " + Arrays.toString(x) + "\n" ); HeapSort.sort( x ); // Heap sort System.out.println("\nAfter sort: " + Arrays.toString(x) ); } </strong></span></pre> </td>
  50. </tr>
  51. </tbody>
  52. </table>
  53. **Output:**
  54. <table>
  55. <tbody>
  56. <tr>
  57. <td> <pre><span style="color:#0000FF;"><strong>After sort: [<span style="color:#FF0000;">0.0,</span> 1.1, 2.5, 3.5, 4.2, 6.4, 7.5, 8.9, 9.2] </strong></span></pre> </td>
  58. </tr>
  59. </tbody>
  60. </table>
  61. --------------------
  62. * **Example Program: **(Demo above code) ![Example.jpg][]
  63. * The **Heap Sort** Prog file: [click here][]
  64. * The **test** Prog file: [click here][click here 1]
  65. **How to run the program:**
  66. <table>
  67. <tbody>
  68. <tr>
  69. <td>
  70. <ul>
  71. <li><span style="color:#0000FF;"><strong>Right click</strong></span>&nbsp;on link and&nbsp;<span style="color:#FF0000;"><strong>save</strong></span>&nbsp;in a scratch directory <p>&nbsp;</p> </li>
  72. <li>To compile: &nbsp;&nbsp;<span style="color:#FF0000;"><strong>javac testProg.java</strong></span></li>
  73. <li>To run: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#FF0000;"><strong>java testProg</strong></span></li>
  74. </ul></td>
  75. </tr>
  76. </tbody>
  77. </table>

发表评论

表情:
评论列表 (有 0 条评论,291人围观)

还没有评论,来说两句吧...

相关阅读