将A[1]与A[5]互换,此时A[5]为序列的最大值,A[5]已经排序完毕,剩余的元素A[1]~A[4]形成新的未排序序列,由于此时序列不是大根堆,需要重构大根堆。 第五步: 将A[1]与A[4]互换,此时A[4]为序列的最大值,A[4]已经排序完毕,剩余的元素A[1]~A[3]形成新的未排序序列,由于此时序列不是大根堆,需要...
这两种分别称为最小堆(min-heap)和最大堆(max-heap)。 下面的图分别示出由同一个整数序列构造出的最小堆和最大堆。 基本操作 二叉堆有两种基本操作:插入(insert/sift-up)和弹出堆顶元素(extract/sift-down),在操作的过程中,需要时刻对堆进行调整,以使它总满足堆的性质。 先来看插入操作,假设我们要在上图...
堆分为大顶堆和小顶堆 大顶堆的堆顶元素时最大的 小顶堆的堆顶元素时最小的 堆本质也是一棵树(完全二叉树) 堆排序的时间复杂度是Nlog(N),空间复杂度是O(1) 基于堆的第二条和第三条特性,可以在实际场景中做很多有意义的事,如下举例: 文章标题的问题,求topN,可以使用堆数据结构 优先级队列,优先级最高...
int i; //将前n个数调整为小根堆 for(i=*n/2-1;i>=0;i--) adjust_min_heap(p,i,*n-1); int j; for(j=*n;j if(p[j]>p[0]) { exchange(&p[j],&p[0]); adjust_min_heap(p,0,*n-1); } } void find_top_n_1(int*p, int begin, int end, int n) { if(begin>=end)...
voidHeapSort(int*a,int n){// 建堆 -- 向上调整建堆for(int i=1;i<n;++i){AdjustUp(a,i);}// 自己先实现} 四.堆排序(利用堆删除的思想来进行排序) 1.排升序——建大堆 分析:1.可以确保每次替换后,最大的数都会到数结尾。2.可以确保每次替换后,再对除最末结点以外的树进行调整,剩下中最大...
冒泡排序,核心思想:相邻比较。每次将最大的浮出水面。 快速排序,核心思想:分治法+挖坑填数。每次选择一基数,排序完成左边比基数小,右边比基数大。一直切分(分治),直至选出无序的最大的N个整数。 堆排序(出场自带猪脚光环~),可以创建一个N大小的最小堆。然后balabala。
大顶堆中存储前半部分数据,小顶堆中存储后半部分数据,且小顶堆中的数据都大于大顶堆中的数据。 也就是说,如果有 n 个数据,n 是偶数,我们从小到大排序,那前 n2 个数据存储在大顶堆中,后 n2 个数据存储在小顶堆中。这样,大顶堆中的堆顶元素就是我们要找的中位数。如果 n 是奇数,情况是类似的,大顶...
void HeapSort(int* a, int n)//整体时间复杂度为nlog(n) { //建大堆排升序,建小堆排降序 //用的都是向下调整法来建堆以及排序 //这里演示升序,如果要降序则修改向下调整法中的 > 变为 < ,使得建立的为小堆,并且后面的排序也将为降序! //建堆 for (int i = (n - 1 - 1) / 2; i >...
>四、原地建堆(堆化) 假设一组序列: let arr = [,1, 9, 2, 8, 3, 7, 4, 6, 5] 1. 原地建堆的方法有两种:一种是承袭上面插入的思想,即从前往后、自下而上式堆化建堆;与之对应的另一种是,从后往前、自上往下式堆化建堆。其中