Large top heap: Based on the complete binary tree, the value of each node is greater than or equal to the value of its left and right child nodes

p moves forward through the loop p -- pointer in the main function

public static void main(String[] args) { int[] arr = {8,7,3,5,4,9,1,3}; for (int p = arr.length-1;p>=0;p--){ adjustHeap(arr,p,arr.length); } }

In the fifth cycle, we finally found the son node

But at this time, temp = 5 > 3 does not meet the exchange conditions, so continue to move forward

At this time, temp = 3 < 5 (its left child node), so exchange

Now it becomes

public static void adjustHeap(int[] arr,int parent,int length){ // Define the value of the parent node int temp = arr[parent]; //Define left child int lChild = 2 * parent +1; //The purpose of the loop is to check whether the child node after the exchange has a child node. If so, compare the size again while (lChild <length){ // Define right child int rChild = lChild + 1; // Find out who is the biggest of the left and right children if (rChild <length && arr[lChild] <arr[rChild]){ lChild++; } if (temp >= arr[lChild]){ break; } // Assign the value of the child node to the position of the parent node arr[parent] = arr[lChild]; parent = lChild; lChild = 2 * lChild+1; } arr[parent] = temp; }

The while loop is to check whether the child node after the exchange has a child node. If so, compare the size again

while (lChild <length){ // Define right child int rChild = lChild + 1; // Find out who is the biggest of the left and right children if (rChild <length && arr[lChild] <arr[rChild]){ lChild++; } if (temp >= arr[lChild]){ break; } // Assign the value of the child node to the position of the parent node arr[parent] = arr[lChild]; parent = lChild; lChild = 2 * lChild+1; }

At this time, the pointer of the parent refers to its child node, and the pointer of its child node refers to the child node of the transformed child node

At this time, there are no child nodes on the transformed parent

So not satisfied

while (lChild <length)

So end the while loop

implement

arr[parent] = temp;

The completion of this step marks the completion of the exchange

End this for loop

Continue the for loop

The value of the parent node is still larger than that of the child node. Do not exchange and continue to move forward

At this time, a large top pile is generated, and the maximum value is generated

To sort the heap, you need to generate a large top heap with an array length

public class HeapSort { public static void main(String[] args) { int[] arr = {8,7,3,5,4,9,1,3}; int l=arr.length; int[] sort =new int[arr.length]; for(int i=sort.length-1;i>=0;i--) { for (int p = l-1;p>=0;p--){ adjustHeap(arr,p,l); } sort[i]=arr[0]; arr[0]=arr[l-1]; l--; } System.out.println(Arrays.toString(sort)); }

A layer of for loop is set outside the for loop that originally generated the large top heap

After the completion of the internal for loop, a large top heap is generated, that is, a current maximum value, which is placed at the last bit of the new array

sort[i]=arr[0];

And remove the first bit of the arr array and put the last bit in the first place, which means that the length of the array is reduced by one

arr[0]=arr[l-1]; l--;

Through two-layer loop, we get an array sorted from large to small

This is heap sorting

Source code:

import java.util.Arrays; public class HeapSort { public static void main(String[] args) { int[] arr = {8,7,3,5,4,9,1,3}; int l=arr.length; int[] sort =new int[arr.length]; for(int i=sort.length-1;i>=0;i--) { for (int p = l-1;p>=0;p--){ adjustHeap(arr,p,l); } sort[i]=arr[0]; arr[0]=arr[l-1]; l--; } System.out.println(Arrays.toString(sort)); } public static void adjustHeap(int[] arr,int parent,int length){ // Define the value of the parent node int temp = arr[parent]; //Define left child int lChild = 2 * parent +1; //The purpose of the loop is to check whether the child node after the exchange has a child node. If so, compare the size again while (lChild <length){ // Define right child int rChild = lChild + 1; // Find out who is the biggest of the left and right children if (rChild <length && arr[lChild] <arr[rChild]){ lChild++; } if (temp >= arr[lChild]){ break; } // Assign the value of the child node to the position of the parent node arr[parent] = arr[lChild]; parent = lChild; lChild = 2 * lChild+1; } arr[parent] = temp; } }