首页 > 其他分享 >堆排序

堆排序

时间:2023-12-20 10:33:27浏览次数:28  
标签:index target int max 堆排序 heapify root

堆排序

heapInsert&heapify排序

思路来源

一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到

笔记内容

  • 问题描述

    对一个数组进行大根堆排序

  • 算法思路

    1. heapInsert :视为用户一个个插入新数值,由下往上比较
    2. heapify :视为对所有子树排序,由子树的头结点从上往下比较
  • 代码实现

    public class Heapsort {
        public static void main(String[] args) {
            int[] target = {5,4,9,7,6,3,6};
            heapify(target,0);
            for (int i = 0; i < target.length; i++) {
                System.out.print(target[i]+" ");
            }
        }
    
        /**
         * 复杂度为nlogn的排序方法
         * */
        public static void heapInsert(int[] target){
            for (int i = 0; i < target.length; i++) {
                int index = i;
                while (true){
                    int max = (index-1)/2;
                    if(index ==0 ){
                        break;
                    }
                    if(target[(index-1)/2] < target[index]){
                        int temp = target[index];
                        target[index] = target[(index-1)/2];
                        target[(index-1)/2] = temp;
                        index = (index-1)/2;
                        max = (index-1)/2;
                    }else {
                        break;
                    }
                }
            }
    
        }
    
        /**
         * 复杂度为n的排序方法
         * */
        public static void heapify(int[] target, int root){
            if(2*root+1 > target.length-1){ //没有子节点
                return;
            }
            heapify(target,2*root+1);
            heapify(target,2*root+2);
            int max = -1;
            while (true){
                if(2*root+2 < target.length){ //有两个孩子
                     max = target[2*root+1] > target[2*root+2] ? 2*root+1 : 2*root+2;
                } else if (2*root+1 < target.length) { //只有左孩子
                     max = 2*root+1;
                }else {
                    break;
                }
                if(target[max] > target[root]){
                    int temp = target[max];
                    target[max] = target[root];
                    target[root] = temp;
                    root = max;
                }else {
                    break;
                }
    
            }
        }
    }
    
    

标签:index,target,int,max,堆排序,heapify,root
From: https://www.cnblogs.com/nouleeee/p/17915934.html

相关文章

  • 堆结构和堆排序
    堆堆是一种特殊的完全二叉树,其他语言中的优先级队列就是堆。堆分为大根堆和小根堆,大根堆即对于每一颗树,它的父亲节点的值,一定大于它的孩子节点的值,左右节点的值不用管它的顺序。小根堆同理。堆的实现通常是用数组实现的,那么对于每一个节点在数组中怎么找到它的父节点和它的左右......
  • 1094. 拼车(差分&堆排序)
    Problem:1094.拼车文章目录题目思路Review差分数组定义区间加法减法更新差分数组:为啥这样更新思路1Code思路2Code题目车上最初有capacity个空座位。车只能向一个方向行驶(也就是说,不允许掉头或改变方向)给定整数capacity和一个数组trips,trip[i]=[numPassengersi,......
  • 排序 - 选择排序 & 堆排序
    选择排序简单选择排序算法描述n-1次遍历,每次选出一个未排序区域中的最小元素放入已排序区域中的合适位置。算法实现voidSelectSort(SqList&L){for(i=1;i<L.length;i++){k=i;for(j=i+1;j<=L.length;j++)if(L.r[j].ke......
  • 堆排序
    目录1.基本原理2.例子3.代码实现本文主要介绍堆排序的原理、例子以及代码实现。1.基本原理堆排序(HeapSort)是一种基于比较的排序算法,它的工作原理是首先将待排序的序列构造成一个大顶堆或小顶堆,然后交换堆顶元素和最后一个元素,然后将剩余元素重新调整为大顶堆或小顶堆,再交换堆......
  • 堆排序
    堆是一种特殊的树形数据结构,它满足以下两个性质:完全二叉树:堆是一棵完全二叉树,即除了最底层之外,其他每一层的节点都被完全填满,且最底层的节点都尽可能地集中在左侧。堆属性:对于最大堆(大顶堆)来说,父节点的值总是大于或等于任何一个子节点的值;对于最小堆(小顶堆)来说,父节点的值总是小于或......
  • 堆以及堆的应用--堆排序
    堆定义:什么是堆?从堆的定义上我们可以看出,堆在物理结构上是一维数组,逻辑结构上,可以把堆理解为一棵完全二叉树,因为堆满足ki<=k2i+1,ki<=k2i+2(ki>=k2i+1,ki>=k2i+2),而我们了解对于完全二叉树,父结点和孩子结点存储在一维数组中有如下的下标关系:leftchild=parent*2+1rightchild=parent*2......
  • 在思想方面讨论堆排序(考研自用,按非递减方式排序)
     目录1.什么是排序2.关于堆排序的几个问题3.问题求解首先:排序的定义  拿冒泡排序(递增)来讲,在一个给定的数组序列中,若A[i+1]<A[i],则将其两个的数值进行交换,排好序的序列应该是递增的,类似于[1,2,3,4,5...];所以排序是在数组中进行的,物理......
  • 09-堆排序
    9.堆排序9.1完全二叉树在满二叉树路上的树。如果二叉树是完全二叉树,并且用数组表示,则:位置i的左右孩子节点为2i+1和2i+2位置i的父节点为(i-1)/29.2堆堆是完全二叉树堆有大根小根之分他的每颗子树都必须满足大根/小根堆9.3堆排序1.题目​ 堆排序......
  • 最大堆最小堆及堆排序
    堆这个数据结构在我大学的教材上没有讲解,但平时听说过堆排序什么的,无疑是要用到这个数据结构,所以本篇文章主要是总结下堆的概念和实现。堆概念在维基百科中,是这样定义堆的:堆(英语:Heap)是计算机科学中的一种特别的树状数据结构。若是满足以下特性,即可称为堆:“给定堆中任意节点P......
  • 堆排序
    时间复杂度为O(n)voidheapify(vector<int>&nums,intn,inti){intlargest=i;//假设为父节点intlson=i*2+1;intrson=i*2+2;//找到最大值if(lson<n&&nums[lson]>nums[largest])swap(nums[lson],nums[largest]);if(rson<......