• 每天一个小算法(Heapsort)


    <pre name="code" class="cpp">1: /*
       2:     输入:数组A,堆的长度hLen,以及需要调整的节点i
       3:     功能:调堆
       4: */
       5:  
       6: void AdjustHeap(int A[], int hLen, int i)
       7: {
       8:     int left = LeftChild(i);  //节点i的左孩子
       9:     int right = RightChild(i); //节点i的右孩子节点
      10:     int largest = i;
      11:     int temp;
      12:  
      13:     while(left < hLen || right < hLen)
      14:     {
      15:         if (left < hLen && A[largest] < A[left])
      16:         {
      17:             largest = left;
      18:         }
      19:         
      20:         if (right < hLen && A[largest] < A[right])
      21:         {
      22:             largest = right;
      23:         }
      24:  
      25:         if (i != largest)   //如果最大值不是父节点
      26:         {
      27:              temp = A[largest]; //交换父节点和和拥有最大值的子节点交换
      28:              A[largest] = A[i];
      29:              A[i] = temp;
      30:  
      31:             i = largest;         //新的父节点,以备迭代调堆
      32:             left = LeftChild(i);  //新的子节点
      33:             right = RightChild(i);
      34:         }
      35:         else
      36:         {
      37:             break;
      38:         }
      39:     }
      40: }
      41:  
      42: /*
      43:     输入:数组A,堆的大小hLen
      44:     功能:建堆
      45: */
      46: void BuildHeap(int A[], int hLen)
      47: {
      48:     int i;
      49:     int begin = hLen/2 - 1;  //最后一个非叶子节点
      50:     for (i = begin; i >= 0; i--)
      51:     {
      52:         AdjustHeap(A, hLen, i);  
      53:     }
      54: }
      55:  
      56: /*
      57:     输入:数组A,待排序数组的大小aLen
      58:     功能:堆排序
      59: */
      60: void HeapSort(int A[], int aLen)
      61: {
      62:     int hLen = aLen;
      63:     int temp;
      64:  
      65:     BuildHeap(A, hLen);      //建堆
      66:  
      67:     while (hLen > 1)
      68:     {
      69:         temp = A[hLen-1];    //交换堆的第一个元素和堆的最后一个元素
      70:         A[hLen-1] = A[0];
      71:         A[0] = temp;
      72:         hLen--;        //堆的大小减一
      73:         AdjustHeap(A, hLen, 0);  //调堆
      74:     }
      75: }


    
    
  • 相关阅读:
    C# 请求API(一次登陆,多次请求)
    C# WebAPI 跨域问题Cors
    正则表达式校验YYYYMMDD
    C# 通过Smtp 完成系统发送邮件
    C# Log4Net 记录项目日志
    C# 自定义Attribute
    C#泛型
    SQL从数据库导出数据到EXCEL换行的问题解决方法
    C# 在MVC 中把DataTable中的数据导出到Excel
    闹心的CSDN
  • 原文地址:https://www.cnblogs.com/batteryhp/p/5020505.html
Copyright © 2020-2023  润新知