三、算法_堆排序
2017-01-11 09:51
169 查看
堆排序
堆排序介绍堆是一个完全二叉树:每个节点的值都大于或等于其左右孩子节点的值,称为大顶堆;或每个节点值都小雨等于其左右孩子的值,称为小顶堆。
堆排序C#实现-顺序存储:
class Program { static void Main (string[] args) { int[] pData = new[] { 50, 10, 90, 30, 70, 40, 80, 60, 20 }; HeapSort(pData); foreach (var i in pData) { Console.Write(i+" "); } Console.WriteLine(); Console.ReadKey(); } public static void HeapSort (int[] pData) { // 遍历数据中非叶节点,把所有子树变成子大顶堆 for (int i = pData.Length / 2; i >= 1; i--) { int pMaxNodeNumber = i; // 最大节点编号 int pTempI = i; while (true) { // 把 i 节点的子树变成大顶堆 int pLeftChildNumber = pTempI * 2; int pRightChildNumber = pLeftChildNumber + 1; // 1、可能两个孩子都存在 // 2、可能只有一个孩子 if (pLeftChildNumber <= pData.Length && pData[pLeftChildNumber - < 4000 span class="hljs-number">1] > pData[pMaxNodeNumber - 1]) { pMaxNodeNumber = pLeftChildNumber; } if (pRightChildNumber <= pData.Length && pData[pRightChildNumber - 1] > pData[pMaxNodeNumber - 1]) { pMaxNodeNumber = pRightChildNumber; } if (pMaxNodeNumber != pTempI) { // 交换 i 和 pMaxNodeNumber的数据 int pTempNode = pData[pTempI - 1]; pData[pTempI - 1] = pData[pMaxNodeNumber - 1]; pData[pMaxNodeNumber - 1] = pTempNode; pTempI = pMaxNodeNumber; } else { break; } } } }
堆排序C#实现-顺序存储(首尾交换,大顶堆的重新构造):
class Program { static void Main (string[] args) { int[] pData = new[] { 50, 10, 90, 30, 70, 40, 80, 60, 20 }; HeapSort(pData); foreach (var i in pData) { Console.Write(i + " "); } Console.WriteLine(); Console.ReadKey(); } // 排序 public static void HeapSort (int[] pData) { // 遍历数据中非叶节点,把所有子树变成子大顶堆 for (int i = pData.Length / 2; i >= 1; i--) { HeapAJust(i,pData,pData.Length); }// End For for (int i = pData.Length; i > 1; i--) { // 交换首位数据 int pTempNumber = pData[0]; pData[0] = pData[i - 1]; pData[i - 1] = pTempNumber; // ------------------------------------------------------- HeapAJust(1,pData,i-1); } } // 方法提取 private static void HeapAJust (int pNumberToJust, int[] pData, int pMaxNumber) { int pMaxNodeNumber = pNumberToJust; // 最大节点编号 int pTempI = pNumberToJust; while (true) { // 把 i 节点的子树变成大顶堆 int pLeftChildNumber = pTempI * 2; int pRightChildNumber = pLeftChildNumber + 1; // 1、可能两个孩子都存在 // 2、可能只有一个孩子 if (pLeftChildNumber <= pMaxNumber && pData[pLeftChildNumber - 1] > pData[pMaxNodeNumber - 1]) { pMaxNodeNumber = pLeftChildNumber; } if (pRightChildNumber <= pMaxNumber && pData[pRightChildNumber - 1] > pData[pMaxNodeNumber - 1]) { pMaxNodeNumber = pRightChildNumber; } if (pMaxNodeNumber != pTempI) { // 交换 i 和 pMaxNodeNumber的数据 int pTempNode = pData[pTempI - 1]; pData[pTempI - 1] = pData[pMaxNodeNumber - 1]; pData[pMaxNodeNumber - 1] = pTempNode; pTempI = pMaxNodeNumber; } else { break; } }//End While }//End HeapAJust }
相关文章推荐
- 算法(2).堆排序
- 白话经典算法系列之七 堆与堆排序
- 重新教自己学算法之递归排序——堆排序(六)
- 快排 和 堆排序算法的细节代码分析
- 算法(2)堆排序
- 编写实现堆排序的算法。
- 堆排序(最小堆)--【算法导论】
- 算法导论学习笔记 第6章 堆排序
- 基本算法:堆排序
- 经典算法和数据结构(一) 优先级队列与堆排序
- 排序算法(四)堆排序的Python实现及算法详解
- 基础算法(二):堆排序,快速排序
- 算法学习笔记----第二部分:排序和顺序统计量----第6章、堆排序
- 算法导论第六章堆排序(一)
- 算法学习之排序学习之堆排序和如何建堆
- Atitit 算法之道 attilax著 1. 第二部分(Part II) 排序与顺序统计(Sorting and Order Statistics) 1 2. 第六章 堆排序(Heapsort)
- Java堆排序(HeapSort)算法实现
- [算法]堆排序
- 【算法与数据结构】图说堆排序
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。