堆排序

一、原理:

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

堆排序的平均时间复杂度为Ο(nlogn) 。

算法步骤:

1)创建一个堆H[0..n-1]

2)把堆首(最大值)和堆尾互换

3)把堆的尺寸缩小1,并调用shift_down(0),目的是把新的数组顶端数据调整到相应位置

4) 重复步骤2,直到堆的尺寸为1

二、代码

#include 
   
   
    
      
using namespace std;  
  
/*最大堆定义*/  
class MaxHeap  
{  
private:  
    int size; //最大堆的元素数目  
int * array;  //最大堆数组的首地址指针  
public:  
    MaxHeap(int array[],int n); //用已有数组初始化一个最大堆   
         void buildHeap();   //构建最大堆  
    void siftDown(int index);  //向下筛选法  
    void swap(int index1,int index2);  //交换位置为index1与index2的元素  
    void removeMax();  //删除堆顶的最大值--与数组最后一个元素交换位置并重新构建最大堆  
    int leftChild(int index);  //返回左孩子的位置  
    int rightChild(int index);  //返回右孩子的位置  
};  #include 
    
    
     
       
#include "MaxHeap.h"  
using namespace std;  
  
/*最大堆成员函数实现*/  
MaxHeap::MaxHeap(int array[],int n)  
{  
    this->array=array;  
    size=n;  
    buildHeap();  
}  
  
void MaxHeap::buildHeap()  
{  
    for(int i=size/2-1;i>=0;i--)  
        siftDown(i);  
}  
  
void MaxHeap::siftDown(int index)  
{  
    int max_index=leftChild(index);  
    while(max_index
     
     
      
      array[max_index])  
            max_index++;  
        if(array[index]>array[max_index])  
            break;  
        swap(index,max_index);  
        index=max_index;  
        max_index=leftChild(index);  
    }  
}  
  
void MaxHeap::swap(int index1,int index2)  
{  
    int temp=array[index1];  
    array[index1]=array[index2];  
    array[index2]=temp;  
}  
  
void MaxHeap::removeMax()  
{  
    swap(0,size-1);  
    size--;  
    siftDown(0);  
}  
  
int MaxHeap::leftChild(int index)  
{  
    return index*2+1;  
}  
  
int MaxHeap::rightChild(int index)  
{  
    return index*2+2;  
}  #include 
      
      
       
         
#include "MaxHeap.h"  
using namespace std;  
  
/*最大堆排序函数*/  
void heapSort(int array[],int n)  
{  
    MaxHeap max_heap=MaxHeap(array,n);  
  
    /*删除堆的最大值(堆顶),即每次将最大值与数组的最后一个元素交换位置*/  
    for(int i=0;i<7;i++)  
        max_heap.removeMax();  
}  
  
int main()  
{  
    int array[8]={4,3,7,1,2,8,5,6};  
    heapSort(array,8);  
    for(int i=0;i<8;i++)  
    cout<
       
       
         <<" "< 
         
       
      
      
     
     
    
    
   
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

gz7seven

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值