首页 > 其他分享 >八大排序--05堆排序

八大排序--05堆排序

时间:2024-10-08 18:50:03浏览次数:11  
标签:大顶 arr parent 05 -- 堆排序 int child

假设数组 arr[]= {5,7,4,2,0,3,1,6},请通过插入排序的方式,实现从小到大排列:

方法:①利用完全二叉树构建大顶堆;

          ②对顶元素和堆底元素进行交换,除堆底元素之外其余元素继续构造大顶堆;

          ③重复步骤②,直到所有元素都不参与构建,整个数组排序完成

【完全二叉树--数据从上到下,从左到右排列】

【大顶堆--父结点的值大于或等于左右孩子结点的值】

堆顶元素和堆底元素进行交换(注:每次交换取值后都要剩余部分重新构建大顶堆)

【大顶堆的检验和调整】

1.定义parent游标指向检测的节点

2.定义parent的左孩子child(有孩子就一定会有左孩子)

3.判断有没有右孩子,如果有右孩子,左右孩子进行比较,让child指向左右孩子中的最大值。

4.parent和child指向的值进行比较,若parent值更大,则符合大顶堆;若parent的值更小,则父子节点进行交换,parent指向child,child指向其左右孩子中的最大值,继续进行比较,直到child为空或是parent指向值最大,则停止。

package Java.start;

import java.util.Arrays;

public class HeapSort {
//堆排序
	public static void main(String[] args) {
		int[] arr= {5,7,4,2,0,3,1,6};
		//一、构建大顶堆
		for (int p=arr.length-1;p>=0;p--) {
			adjust(arr, p, arr.length);
		}
		//二、堆底堆顶元素进行交换
		for(int i=arr.length-1;i>0;i--) {
			int temp=arr[i];
			arr[i]=arr[0];
			arr[0]=temp;
			adjust(arr, 0, i);
		}
		//打印
		System.out.println(Arrays.toString(arr));
	}
	//堆的维护
	public static void adjust(int[] arr,int parent,int length) {
		//定义左孩子
		int child=2*parent+1;
		while(child<length) {
			//定义右孩子
			int rchild=child+1;
			if(rchild<length && arr[rchild]>arr[child]) {
				child++;
			}
			//child指向左右孩子中的最大值
			
			//父子节点进行比较
			if(arr[parent]<arr[child]) {
				//父子节点进行交换
				int temp=arr[parent];
				arr[parent]=arr[child];
				arr[child]=temp;
				//parent指向child,child继续指向左右孩子中的最大值
				parent=child;
				child=2*child+1;
			}else {
				break;
			}
		}
	}
}

 结果:

标签:大顶,arr,parent,05,--,堆排序,int,child
From: https://blog.csdn.net/m0_74977981/article/details/142766311

相关文章

  • C++刷题:RGB色值转Integer
    问题描述:实现一个函数,输入为长度为三的rgb字符串,返回为十六进制HEX格式字符串。输入格式:字符串输出格式:数字输入样例:"rgb(192,192,192)"输出样例:12632256问题分析:    首先要进行字符串的处理。输入"rgb(192,192,192)",想办法将三个192提取出来,再将192192......
  • C++刷题:加一操作
    问题描述小W拥有一项魔法,可以对任意数字字符串进行加一的操作,比如当他拿到“798”这样的数字字符串,每一次操作,他会将其中每一个字符进行加一,比如经过一次操作后得到了“8109”。他想知道操作`k`次后,这个数字将会变成多少,由于答案可能很大,最终结果需要对1000000007取......
  • P1835
    终于想起来发博客了,呃呃呃呃呃呃这题不难,但要看到1≤L≤R<231和R−L≤106。我们可以考虑先把<216的素数先筛出来,然后再把区间里的合数筛光。然后……就没有然后了。上代码:#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintmaxn=5e5+5;intl......
  • 实验2 C语言分支与循环基础应用编程-1
    任务一#include<stdio.h>#include<stdlib.h>#include<time.h>#defineN5#defineN1397#defineN2476#defineN321intmain(){intcnt;intrandom_major,random_no;srand(time(NULL));//以当前系统时间作为随机种子cnt=0;......
  • 利士策分享,节后重启,再启新程
    利士策分享,节后重启,再启新程随着日历翻过最后一页法定节假日的篇章,我们再次回到了熟悉而繁忙的工作岗位上。那些与家人团聚的温馨时光,那些悠然自得的休闲日子,仿佛还在眼前,却又已悄然远去。面对这突如其来的“工作日模式”,或许有人心生留恋,或许有人满怀期待,但无论如何,生活总......
  • 竖线外的星号
    题目描述给出仅由a - z,A - Z,0 - 9,*,|等字符组成的字符串SS每两个||为一对换言之,第一个|和第二个|为一对,第三个和第四个||为一对,以此类推请你统计不在|对间S中*的数目每个竖线|都会恰好只属于一个对输入格式输入一行一个字符串S输出格式输出一个整数,表......
  • キーエンスプログラミングコンテスト2024(AtCoder Beginner Contest 374)
    A.Takahashisan2判断一个字符串是否以san结尾usingnamespacereader;intmain(){strings;cin>>s;if(s[s.length()-1]=='n'ands[s.length()-2]=='a'ands[s.length()-3]=='s'){cout<<"Yes";......
  • 基于SSM的医院排班管理系统【附源码+文档】
    ......
  • 三.字符串的使用与符号之一
    七.字符串的符号7.1_字符串声明一对单引号/一对双引号/一对三个单引号/一对三个双引号a='测试'b="ces"c='''hello'''d="""你好!"""print(a,b,c,d)7.2_字符串引号包裹原则外单内双,外双内单w='say:"我是字符串,多个引号包裹!"'7.......
  • 玄机——第四章-windows日志分析 wp
    文章目录一、前言玄机邀请码免费分享二、概览简介三、参考文章四、步骤(解析)准备步骤#1.0步骤#1.11、审计桌面的logs日志,定位所有扫描IP,并提交扫描次数步骤#1.22、审计相关日志,提交rdp被爆破失败次数拓展1.1步骤#1.33、审计相关日志,提交成功登录rdp的远程IP地址,多个......