最大堆排序Max_Heapify

//  Max_Heapify.cpp : Defines the entry point for the console application.
//堆排序是一种原地排序,如果试图引入数组,那么将失去这一优势。
 //最大堆满足条件A[Parent[i]]>=A[i]

#include 
" stdafx.h "
#include 
< iostream >
#include 
< algorithm >

class  Max_Heapify {
private:
    
int m_size;
    
int Parent(int i)return i/2; }
    
int Left(int i)  return 2*i; }
    
int Right(int i) {return 2*i+1;}
    
    
void Max_Adus_Heapify(int A[],int i)
    
{
        
int l = Left(i);
        
int r = Right(i);
        
int largest = i;
        
if((l <= m_size) && (A[l] > A[i]))//
            largest = l;
//从元素A[Left(i)],A[Right(i)],A[i]找出最大的元素。
        
        
if((r <= m_size) && (A[r] >A[largest]))
            largest 
= r;
//并将下标存放在largest中。如果A[i]最大,则以i为根的子树而使i及其子树满足堆的性质。        
        if (largest != i)//如果A[i]是最大的,则以i为根的子树已是最大根,程序结束。
        
{
          std::swap(A[i], A[largest] );
//
         Max_Adus_Heapify(A, largest); //
        }

//下标为largest的节点在交换后的值是A[i],以该节点为根的子树又有可能违反最大堆的性质。因而要递归调用。        
    
    }

    
void Build_Max_Heapify(int A[])
    
{   
           
for(int i = m_size/2; i >= 0; i--)
           Max_Adus_Heapify(A, i);
    }

//建堆:子数组A[n/2+1...n]中的元素都是叶子节点,因此每个都可以看作只含一个元素的堆.
//m_size/2与m_size一样都正确,也就是上面句子的解释。


public:
    Max_Heapify():m_size(NULL)
{}
    Max_Heapify(
int A[],int size)
    

        m_size 
=  size-1;
        Build_Max_Heapify(A);
    }

   
    
void Heap_Sort(int A[])
    
{  
        Build_Max_Heapify(A);
        
for(int i = m_size; i >= 1; i--)
        
{
            std::swap(A[
0], A[i]);
            
--m_size;
            Max_Adus_Heapify(A, 
0);
        }

    }
      
 
//Build_Max_Heapify(),将使A[0]达到最大值。这样一直循环交换存放在数组A[i]中,递归调用。

    
~Max_Heapify(){}
}
;

int  main( int  argc,  char *  argv[])
{
    
    
int A[11= 3045227291226802243,1};
    
int size = sizeof(A)/sizeof(A[0]);
    Max_Heapify p(A, size);
    p.Heap_Sort(A);
    std::copy(A, A
+11, std::ostream_iterator<int>(std::cout, " "));
    
return 0;
}

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,请参考下面的 C 代码实现: ```c #include <stdio.h> #include <stdlib.h> // 宏定义,计算数组下标对应的父节点、左孩子节点和右孩子节点的下标 #define PARENT(i) ((i - 1) / 2) #define LEFT_CHILD(i) (2 * i + 1) #define RIGHT_CHILD(i) (2 * i + 2) // 最大堆调整函数,维护最大堆的性质 void max_heapify(int arr[], int i, int heap_size) { int largest = i; int left = LEFT_CHILD(i); int right = RIGHT_CHILD(i); // 找到三个节点中的最大值 if (left < heap_size && arr[left] > arr[largest]) { largest = left; } if (right < heap_size && arr[right] > arr[largest]) { largest = right; } // 如果最大值已经不是 i,那么交换 i 和最大值的位置,递归调用 max_heapify if (largest != i) { int temp = arr[i]; arr[i] = arr[largest]; arr[largest] = temp; max_heapify(arr, largest, heap_size); } } // 建立最大堆的函数 void build_max_heap(int arr[], int len) { int i; for (i = len/2-1; i >= 0; i--) { max_heapify(arr, i, len); } } // 堆排序函数 void heap_sort(int arr[], int len) { build_max_heap(arr, len); // 先建立最大堆 int i; int heap_size = len; for (i = len - 1; i > 0; i--) { // 将堆的最大值交换到数组的末尾 int temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; heap_size--; // 堆大小减一 max_heapify(arr, 0, heap_size); // 调整堆 } } int main() { int arr[] = {6, 5, 3, 1, 8, 7, 2, 4}; int len = sizeof(arr) / sizeof(arr[0]); heap_sort(arr, len); int i; for (i = 0; i < len; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; } ``` 上述代码中,max\_heapify 函数用来调整最大堆,build\_max\_heap 函数用来建立最大堆,heap\_sort 函数用来排序。建立最大堆的时间复杂度为 O(n),堆排序的时间复杂度为 O(nlogn)。 如果您还有任何疑问或者需要进一步的帮助,请随时与我联系。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yshuise

权术横行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值