首页 > 其他分享 >堆排序

堆排序

时间:2023-09-19 15:55:35浏览次数:33  
标签:下标 nums int 堆排序 heapify swap largest

时间复杂度为O(n)

void heapify(vector<int>& nums,int n,int i){
    int largest=i;//假设为父节点
    int lson=i*2+1;
    int rson=i*2+2;
    //找到最大值
    if(lson<n&&nums[lson]>nums[largest])
        swap(nums[lson],nums[largest]);
    if(rson<n&&nums[rson]>nums[largest])
        swap(nums[rson],nums[largest]);
    if(largest!=i){
        swap(nums[largest],nums[i]);
        heapify(nums,n,largest);
    }
}
void heap_sort(vector<int>& nums,int n){
    int i=0;
    //键堆,从下往上建,从父结点开始
    for(i=n/2-1;i>=0;i--){
        heapify(nums,n,i);
    }
    //排序
    for(int j=n-1;j>=0;j--){
        swap(nums[j],nums[0]);
        heapify(nums,j,0);
    }
}

假设当前节点的下标为i

父节点下标:(i/2)-1;

左孩子的下标:i*2+1;

右孩子的下标:i*2+2;

标签:下标,nums,int,堆排序,heapify,swap,largest
From: https://www.cnblogs.com/wangkaixin-yy/p/17714875.html

相关文章

  • 深入了解堆排序算法
    堆排序(HeapSort)是一种高效的、基于堆数据结构的排序算法,它具有稳定性和可预测的性能,适用于各种数据规模。本文将详细介绍堆排序的工作原理,提供示例和Python、Go、Java以及C语言的实现代码。堆排序的基本思想堆排序的核心思想是通过构建一个二叉堆,将待排序的数组转换为一个堆,然后反......
  • 并查集 堆排序 (9/10)
    并查集模板 注意查找到后查找的节点直接连接根节点#include<iostream>usingnamespacestd;constintN=100010;intp[N];//关键记住find函数intfind(inta){if(p[a]!=a)p[a]=find(p[a]);//不等于根节点就往头结点走,并且等于returnp[a];}intma......
  • Java 堆排序
    思路从最后的非叶子节点开始,从后向前构建一个堆(大顶堆/小顶堆);即最后的非叶子节点和其下的叶子节点构成一个大顶堆,然后再找前面一个非叶子节点继续此时根节点是最大的数据,然后将根节点和最后一位进行交换交换后,排除最后一位最大值,再从根节点开始构建大顶堆重复2,3步骤代码......
  • c++ 堆排序
    堆排序主要分为两个函数:1、构建堆2、元素调整#include<iostream>usingnamespacestd;voidmaxHeap(inttree[],intn,inti){ if(i>=n) return; intlchild=i*2+1; intrchild=i*2+2; intmax=i; if(lchild<n&&tree[lchild]>t......
  • 堆排序 桶排序 基数排序
    堆排序使用数组和表示堆大小的整数heapSize表示堆:vector<int>arr{9,5,3,7,2};intheapSize=5;heapSize=5表示数组从索引0开始的5个元素表示一个堆。堆结构就是用数组实现的完全二叉树结构。求数组中索引i位置节点的父子节点:父节点:(i-1)/2左子节点:2*i+1右子节......
  • 堆排序
    堆是以二叉树为结构组成的一个序列,一般以数组进行实现,如设N=1为根节点,则左节点2*N,右节点2*N+1,以此构建一整个堆。堆结构体的数据结构typedefintItem;typedefstructmaxHeap{  Item*data; //堆的数组实现  intcount; //实际存在的数据量}maxHea......
  • 选择排序——简单选择排序和堆排序,C++代码实现
    #include<iostream>usingnamespacestd;typedefstruct{ intr[100+1]; intlength;}SqList;//简单选择排序voidSimpleSlectSort(SqList&L){ intmin,i,j; for(i=1;i<L.length;i++) { min=i; for(j=i+1;j<=L.length;j++) if(L.r[j]<L.r[m......
  • 数据结构-堆排序
    java实现堆排序算法源代码publicclassHeapSortextendsDataCrol{privatevoidheapify(intA[],inti,intsize){//从A[i]向下进行堆调整intleftChild=2*i+1;//左孩子索引intrightChild=2*i+2;//右孩子索引intmax=......
  • 【数据结构】选择排序 简单选择+堆排序
    选择排序的基本思想是每次从待排序的序列中选出最小值(或者最大值)依次放在已排序序列中,直到待排序序列为空,此时序列已完全有序。选择排序的选择只需要进行n-1趟,因为当剩余元素数量为1时无需再选择,直接放在排序序列的末尾即可。在这里学简单选择排序和堆排序两种算法,简单选择考的......
  • 堆排序(topk 问题)(NB)
    博客地址:https://www.cnblogs.com/zylyehuo/#_*_coding:utf-8_*_#比较排序importrandomdefsift(li,low,high):#堆的向下调整(小根堆)i=lowj=2*i+1tmp=li[low]whilej<=high:ifj+1<=highandli[j+1]<li[j]:......