堆排序(C#)

来源:互联网 发布:域名被墙 301跳转 编辑:程序博客网 时间:2024/04/30 15:37

堆排序(C#)

(二叉)堆数据结构是一种数组对象,它可以被视为一颗完全二叉树.
完全二叉树(Complete Binary Tree)
若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的节点都连续集中在最左边,这就是完全二叉树。 
完全二叉树是由满二叉树而引出来的。对于深度为K的,有N个结点的二叉树,
当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。
(完全二叉树)
在堆中对于某一节点i,如果它有左右儿子,则左儿子Left(i)的索引(从0开始)为i*2+1,
右儿子Right(i)的索引为i*2+2,节点i的父节点索引为(i-1)/2.
代码如下:
[c-sharp] view plaincopyprint?
  1. /// <summary>  
  2. ///  最小堆排序(升序)  
  3. /// </summary>  
  4. public static int[] MinHeapSort(int[] a)  
  5. {  
  6.     // 将数组构建为最小堆  
  7.     BulidMinHeap(a);  
  8.   
  9.     int aLenght = a.Length;  
  10.     int heapSize = aLenght;  
  11.     int[] sorttedArray = new int[a.Length];  
  12.     for (int i = 0; i < aLenght; i++)  
  13.     {  
  14.         // 将根节点的最小值取出  
  15.         sorttedArray[i] = a[0];  
  16.         a[0] = a[heapSize - 1];  
  17.   
  18.         MinHeapify(a, 0, heapSize--);  
  19.     }  
  20.   
  21.     return sorttedArray;  
  22. }  
  23.   
  24. /// <summary>  
  25. /// 将数组构建为最小堆  
  26. /// </summary>  
  27. public static void BulidMinHeap(int[] a)  
  28. {  
  29.     for (int i = a.Length / 2 - 1; i >= 0; i--)  
  30.     {  
  31.         MinHeapify(a, i, a.Length);  
  32.     }  
  33. }  
  34.   
  35. /// <summary>  
  36. /// 调整二叉堆,即将以i为根节点的二叉树调整为最小堆  
  37. /// </summary>  
  38. public static void MinHeapify(int[] a, int i, int heapSize)  
  39. {  
  40.     int left = i * 2 + 1;// 左儿子的索引  
  41.     int right = i * 2 + 2;// 右儿子的索引  
  42.     int mivValueIndex = i;// 保存最小值的索引  
  43.   
  44.     if (left < heapSize && a[i] > a[left])  
  45.     {  
  46.         // 左儿子小于当前节点,则记录做儿子的索引,作为最小值索引  
  47.         mivValueIndex = left;  
  48.     }  
  49.     if (right < heapSize && a[mivValueIndex] > a[right])  
  50.     {  
  51.         // 右儿子小于当前节点,则记录做儿子的索引,作为最小值索引  
  52.         mivValueIndex = right;  
  53.     }  
  54.   
  55.     if (mivValueIndex != i)  
  56.     {  
  57.         // 交换根和子节点值  
  58.         int temp = a[i];  
  59.         a[i] = a[mivValueIndex];  
  60.         a[mivValueIndex] = temp;  
  61.   
  62.         // 递归处理子树  
  63.         MinHeapify(a, mivValueIndex, heapSize);  
  64.     }  
  65. }  
0 0