基本思想
1.将待排序的序列构造成大顶堆,根据大顶堆的性质,当前的堆顶是序列中最大的元素。
2.将堆顶元素与堆底元素进行交换,将剩下的元素构造成大顶堆。
3.重复2.
步骤
第一步:构建大顶堆
1.初始化状态
2. 节点parent不存在孩子节点,p往前移动
3.节点1,9,4也不存在孩子节点,p继续往前移动。节点5有孩子结点
4.节点5的值大于lchild的值, p继续往前移动。
5.节点3的值小于lchild的值,与lchild进行值交换。父节点指向lchild,父节点没有孩子节点,p前移。
6.节点7的值大于lchild,lchild的值大于rchild,p前移。
7.节点8的lchild的值小于rchild,lchild++指向rchild。rchild大于8,与rchild进行值交换。
第二步:将堆顶元素与堆底元素进行交换,剩余的元素重新构造大顶堆(重复第一步)
1.堆顶堆底值交换
2.剩余元素构建大顶堆
3.堆顶堆底值交换
4.剩余元素构建大顶堆
5.堆顶堆底值交换
6.剩余元素构建大顶堆
7.堆顶堆底值交换
8.剩余元素构建大顶堆
9 .堆顶堆底值交换
10.剩余元素构建大顶堆
11 .堆顶堆底值交换
12.剩余元素构建大顶堆
13.堆顶堆底值交换
排序结果
实现代码
package com.qcby; import java.util.Arrays; public class HeapSort { //堆排序 public static void main(String[] args) { // TODO Auto-generated method stub int[] arr = { 8,7,3,5,4,9,1,3 }; for (int p = arr.length - 1; p >= 0; p--) { adjustHeap(arr, p, arr.length); } System.out.println(Arrays.toString(arr)); for (int p = arr.length - 1; p > 0; p--) { int temp = arr[0]; arr[0] = arr[p]; arr[p] = temp; adjustHeap(arr, 0, p); System.out.println(Arrays.toString(arr)); } //System.out.println(Arrays.toString(arr)); } public static void adjustHeap(int[] arr, int parent, int length) { int temp = arr[parent]; int lchild = parent * 2 + 1; while (lchild < length) { int rchild = lchild + 1; if (rchild < length && arr[lchild] < arr[rchild]) { lchild++; } if (temp > arr[lchild]) { break; } arr[parent] = arr[lchild]; parent = lchild; lchild = parent * 2 + 1; } arr[parent] = temp; } }