首页 > 其他分享 >自建堆排序:

自建堆排序:

时间:2023-04-05 11:48:19浏览次数:32  
标签:tmp int 堆排序 num heap 节点 size

建堆(heapification):

蛮力算法

空堆反复调用insert()接口,消耗时间过多,第k轮迭代需O(logK)时间,正比于其深度:总共需要O(log n!) = O(n log n);同理于自顶向下、自左向右的上滤操作;

实现时先入一个最大值元素,放在下标为0的地方,此后,元素从下标为1 的地方进行建堆,假设父节点下标是 i,则左右子节点 是2*i,2*i+1;

class Priority_ueue{
private:
    int heap_size;
    vector<int>heap;
public:
    Priority_ueue(){
        heap.push_back(INT_MAX);
        heap_size = 0;
    }
    void insert(int num){
        heap.push_back(num);
        ++heap_size;
        int tmp = heap_size;
        for(;num > heap[tmp/2];tmp /= 2){
            heap[tmp] = heap[tmp/2];
        }
        heap[tmp] = num;
    }//上滤
    int delmax(){
        if(heap_size == 0){
            cout << "delmax error!" << endl;
            return INT_MAX;
        }else{
            int res = heap[1];
            int num = heap[heap_size--];
            heap.pop_back();
            int pos = 1, tmp = pos*2;
            while(tmp < heap_size){
                if(tmp+1 <= heap_size) tmp = heap[tmp] > heap[tmp+1] ? tmp : tmp + 1;
                if(num < heap[tmp]){
                    heap[pos] = heap[tmp];
                    pos = tmp;
                    tmp *= 2;
                }else{
                    break;
                }
            }//下滤
            heap[pos] = num;
            return res;
        }
    }
    bool empty(){
        return heap_size == 0;
    }
    int size(){
        return heap_size;
    }
};

测试样例:

int main(){
    int tmp;
    Priority_queue q;
    while(cin >> tmp){
        q.insert(tmp);
    }
    while(!q.empty()){
        cout << q.delmax() << endl;
    }
    return 0;
}

floyd算法:

 自下而上的、下滤操作:对所有的节点进行一次下滤, 每个节点下滤所需的时间正比于其高度,故总体运行时间取决于高度总和;相较于蛮力算法,深度小的节点远远少于高度小的节点;

 

标签:tmp,int,堆排序,num,heap,节点,size
From: https://www.cnblogs.com/xuan01/p/17288881.html

相关文章

  • 【数据结构与算法】堆与堆排序
    堆与堆排序1堆的概念堆用于维护一个数集。堆是一个完全二叉树小根堆:每个结点都小于等于它的左右子结点(递归定义)推论:每个结点都是以其为根节点的子树的最小值......
  • 堆排序——C语言描述
    堆排序——C语言描述目录堆排序——C语言描述0测试用例框架1定义2代码4测试用例0测试用例框架https://blog.csdn.net/m0_59469991/article/details/127137119?csdn......
  • 漫画:什么是堆排序算法?
    面试官:写一个堆排吧堆排是基于堆的一种排序算法,对于堆的了解,请看可以管理时间的二叉堆(如果对堆的插入和删除不清楚,强烈建议先看堆),今天我们聊聊堆排的思想,复杂度以及稳定......
  • 堆排序
    【经典算法】:堆排序 1.概述堆排序(HeapSort)就是利用堆(假设利用大顶堆)进行排序的方法。原理:将待排序的序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根结点,将......
  • 数据结构与算法【基础版】:4.9 常用排序算法之堆排序(属于选择排序)【简单选择排序在3.6
    堆排序大顶堆:父节点始终大于任意子节点小顶堆:任意一个子节点都比父节点大思路:先找到最后一个非叶子节点,即最后一个节点的父节点和他的左右节点比较,左右节点大的情况和父节点......
  • 堆排序 golang实现
    堆排序golang实现大根堆直接上代码,有问题联系我packagesortimport"testing"funcHeapSort(arr[]int)[]int{ iflen(arr)<=1{ returnarr } fori:=......
  • 堆排序
    leetcode-FindKthLargestpublicclassKthLargest{publicstaticvoidmain(String[]args){System.out.println(findKthLargest(newint[]{3,2,1,5,6,4}......
  • 算法导论:堆排序
    维护堆主要思想比较\(A[i],A[Left(i)]\)和\(A[Right(i)]\)的大小如果\(A[i]\)不是最大的,则将其与比较大的孩子节点进行交换在堆中继续向下比较和交换,直到\(i......
  • 选择排序+堆排序(实现)
    王道督学营17.1/*Description读取10个整型数据1263589541356503844,然后通过选择排序,堆排序,分别对该组数据进行排序,输出2次有序结果,每个数的输出占3个空格完......
  • 堆排序(Heap Sort)
    一、算法概述1.1算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排......