堆排序

问题:对可以分为大顶堆和小顶堆。

大顶堆满足父节点大于左右孩子节点:父节点i,则i>2*i  ;i>2*i+1;

小顶堆满足父节点小于左右孩子节点:父节点i,则i<2*i  ;i<2*i+1;

指针问题,在交换两个变量时,确保交换,要用指针。

下面代码是小顶堆排序。

代码:

#include  <iostream>
using namespace std;
 
void buildHeap(int arr[],int length)         //建立堆
{
    int i;
    int *min;
    int *temp;
    int t;
    int f;
    int k;
    int flag;
    int n=length/2;
    for(i=n;i>0;i--)
    {
        f=i;
     
        while(2*f<=length)            //循环向下判断
        {
            temp=&arr[f-1];
            min=&arr[2*f-1];
            flag=2*f;
            if(2*f+1<=length)
            {
                if(arr[2*f]<*min)     //选择孩子节点中较小的节点
                {
                    min=&arr[2*f];
                    flag=2*f+1;
                }
            }
            if(*min<*temp)            //父节点小于孩子节点,则交换
            {
            //  cout<<*temp<<":"<<*min<<"--";
                t=*temp;
                *temp=*min;
                *min=t;
                f=flag;
            //  cout<<flag<<"--";
            }
            else
                break;
        }
 
    }
}
void heapSort(int arr[],int length)          //  堆排序
{
    buildHeap(arr,length);
    cout<<arr[0]<<"  ";
    arr[0]=arr[length-1];
}
int main()
{
    int arr[10]={9,3,5,1,2,0,4,8,6,7};
    int i,j;
    cout<<"排序前:"<<endl;
    for(i=0;i<10;i++)
    {
        cout<<arr[i]<<"  ";
    }
    cout<<endl;
    cout<<"堆排序后:"<<endl;
    for(j=10;j>0;j--)
    {
        heapSort(arr,j);
    }
    cout<<endl;
    return 0;
}

 运行结果:

posted @   xshang  阅读(338)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示