C++堆排序

news/2024/5/19 5:30:41 标签: 算法, 数据结构, 堆排序, c++
#include <iostream>
using namespace std;
void print(int *arr,int n)
{
    for(int i=0;i<10;i++)
    {
        cout<<arr[i]<<" ";
    }
    cout<<endl;
}
//shiftDown对于从索引k开始检查以k为根的子树是否满足堆的定义(父节点大于孩子节点)
void shiftDown(int *arr,int n,int k)
{
    while(2*k+1<n)//2*k+1<n表示以k索引为根的子树拥有孩子
    {
        int j=2*k+1;//j索引记录要和k交换的孩子,初始化为左孩子
        if(j+1<n && arr[j+1]>arr[j])//如果右孩子比左孩子大,则j+1
        {
            j+=1;
        }
        if(arr[k]>arr[j])//如果arr[k]>arr[j]表明父节点大于最大的孩子节点,无需交换
            break;
        swap(arr[k],arr[j]);//否则交换
        k=j;
    }
}
//heapify过程建堆,让一个数组成为堆的排列
//只需要从第一个非叶子节点开始到根节点逐一shiftDown过程就好了
void heapify(int *arr,int n)
{
    for(int i=(n-1)/2;i>=0;i--)
    {
        shiftDown(arr,n,i);
    }
}
//原地堆排序,不需要开辟新的空间,由于heapify过程后数组已经成为一个堆得排列,此时arr[0]是堆顶最大元素,只需要交换arr[0]和最后一个元素,此时最后一个元素就成为最大元素,这个操作会破坏堆的排列,此时对除过最后一个元素剩下的元素进行shiftDown操作就好了
void heapSort(int *arr,int n)
{
    for(int i=n-1;i>0;i--)
    {
        swap(arr[0],arr[i]);
        shiftDown(arr, i, 0);
    }
}
int main()
{
    int arr[] {9,6,4,2,12,7,3,1,5,8};
    heapify(arr, 10);
    //print(arr,10);
    heapSort(arr, 10);
    print(arr,10);
    return 0;
}


http://www.niftyadmin.cn/n/923641.html

相关文章

C++二分搜索树相关问题

//二叉树的深度优先遍历即为前序中序后序遍历&#xff0c;因为每次前中后序遍历都需要递归到底。所以为深度 //二叉树的广度优先遍历即为层序遍历 //二叉搜索树的遍历都为O(n) //二分搜索树的缺点之一&#xff1a;一组数据可能组成不同的二叉树&#xff0c;极端情况下可能组成一…

C++并查集的实现以及rank优化

第一个版本的并查集 #include <iostream> #include <cassert> using namespace std; class UnionFind { private:int *id;int count; public:UnionFind(int n){countn;idnew int [n];for(int i0;i<n;i)id[i]i;}~UnionFind(){delete [] id;}int find(int p){ass…

TCP连接超时

如果客户端访问一个距离它很远的服务器&#xff0c;后者由于网络繁忙&#xff0c;导致服务器对于客户端发出的同步报文段没有应答&#xff0c;此时客户端程序必然先进行重连&#xff0c;如果重连多次仍然无效&#xff0c;则通知应用程序连接超时 结论&#xff1a;TCP连接超时的…

connect系统调用失败的原因

connect首先给服务器发送一个同步报文段&#xff0c;使连接成为SYN_SENT状态&#xff0c;此后&#xff0c;connect可能因为两个原因导致失败&#xff1a; ①如果connect连接的目标端口不存在&#xff0c;或者该端口仍处于TIME_WAIT状态&#xff0c;则服务器将发送一个复位报文…

FIN_WAIT2状态的弊端以及TIME_WAIT状态分析及作用

只有处于FIN_WAIT2状态的客户端等待到服务器的结束报文段&#xff0c;才能转移至TIME_WAIT状态&#xff0c;否则它将一直停留在这个状态&#xff0c;如果不是为了在半关闭状态下继续发送数据&#xff0c;连接长时间的停留在FIN_WAIT2状态并无益处&#xff0c;连接停留在FIN_WAI…

socket基础API(socket,bind,listen,accept,close)深入解析

①socket()系统调用声明 int socket(int domain,int type,int protocol);domain告诉系统使用哪个底层的协议族&#xff1a; PF_INET&#xff1a;IPV4 PF_INET6&#xff1a;IPV6 type参数指定服务类型 SOCK_STREAM服务&#xff08;流服务&#xff09;–TCP SOCK_UGRAM服务&…

图论基础(邻接矩阵,邻接表,深度优先遍历,连通分量)的实现

DenseGraph.h.表示邻接矩阵实现的图&#xff0c;一般邻接矩阵用于较为稠密的图 #ifndef DenseGraph_h #define DenseGraph_h#include <iostream> #include <vector> #include <cassert>using namespace std; //稠密图 --邻接矩阵 class DenseGraph { privat…