【重温篇】八大排序——堆排序

完全二叉树

首先复习一下完全二叉树:数据从上到下,从左到右依次进行排列

堆排序

第一步

利用完全二叉树构建大顶堆

大顶堆:父节点的值大于或等于其左右孩子的值(构建方法如下)

1.定义一个parent游标,让parent游标从后往前移动,直到有孩子节点停下来

2.定义parent的左孩子child,判断左孩子是否为空,有孩子,一定会有左孩子

3.如果左孩子不为空,判断有没有右孩子,如果有有孩子,那么左右孩子进行对比,child游标指向左右孩子的最大值

4.父节点和子节点进行对比,如果父节点的值大,就让parent继续往前移动;如果父节点的值小,就让父子节点的值进行交换,父节点指向子节点,子节点指向其左右孩子的最大值,如果child没有孩子,parent不再往下指

5.不断重复2-4步,直到大顶堆构建完成

第二步

让堆顶元素和堆底元素进行互换,互换完成之后,堆底元素不再参与构建

第三步

不断重复一二两步

源码

复制代码
public class HeapSort {

	public static void main(String[] args) {
		
		int[] arr = new int[] {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++;
			}
			
			if(arr[parent] < arr[Child]) {
				//父子节点进行交换
				int temp = arr[parent];
				arr[parent] = arr[Child];
				arr[Child] = temp;
				parent = Child;
				Child = 2*Child+1;
			}else {
				break;
			}
			
		}
	}
}
相关推荐
浮灯Foden38 分钟前
算法-每日一题(DAY13)两数之和
开发语言·数据结构·c++·算法·leetcode·面试·散列表
山顶风景独好5 小时前
【Leetcode】随笔
数据结构·算法·leetcode
科大饭桶6 小时前
C++入门自学Day11-- String, Vector, List 复习
c语言·开发语言·数据结构·c++·容器
Cx330❀7 小时前
【数据结构初阶】--排序(四):归并排序
c语言·开发语言·数据结构·算法·排序算法
艾莉丝努力练剑8 小时前
【C语言16天强化训练】从基础入门到进阶:Day 1
c语言·开发语言·数据结构·学习
番薯大佬8 小时前
编程算法实例-冒泡排序
数据结构·算法·排序算法
ankleless9 小时前
数据结构(03)——线性表(顺序存储和链式存储)
数据结构·考研·链表·顺序表·线性表
KarrySmile9 小时前
Day8--滑动窗口与双指针--1004. 最大连续1的个数 III,1658. 将 x 减到 0 的最小操作数,3641. 最长半重复子数组
数据结构·算法·双指针·滑动窗口·不定长滑动窗口·最大连续1的个数·最长子数组
大阳12321 小时前
线程(基本概念和相关命令)
开发语言·数据结构·经验分享·算法·线程·学习经验
FPGA1 天前
探讨4B/5B编码、8B/10B编码区别以及FPGA实现
数据结构