排序算法(二)选择排序---堆排序

时间:2021-09-29 11:07:07

 概念:利用树结构进行排序。

 分类:1、大顶堆: 每个小树的根节点都大于子节点     升序排序使用大顶堆

    2、小顶堆:每个小树的子节点都大于根节点   降序排序使用小顶堆

 

 1 public class HeapSort {
 2     
 3     public static void main(String[] args){
 4         int[] arr=new int[]{9,6,7,0,1,10,4,2};
 5         System.out.println(Arrays.toString(arr));
 6         heapSort(arr);
 7         System.out.println(Arrays.toString(arr));
 8     }
 9     
10     public static void heapSort(int[] arr){
11             //开始位置是最后一个非叶子节点,即最后一个节点的父节点
12             int start=(arr.length-1)/2;
13             //调整为大顶堆
14             for(int i=start;i>=0;i--){
15                 maxHeap(arr,arr.length,i);
16             }
17             //先把数组中的第0个和堆中最后一个数交换位置,再把前面的处理为     大顶堆
18             for(int i=arr.length-1;i>0;i--){
19                 int temp=arr[0];
20                 arr[0]=arr[i];
21                 arr[i]=temp;
22                 maxHeap(arr,i,0);
23             }
24     }
25     
26     // size:数组在后面依次先前遍历                        当前节点
27     public static void maxHeap(int[] arr,int size,int index){
28         //左子节点
29         int leftNode=2*index+1;
30         //右子节点
31         int rightNode=2*index+2;
32         int max=index;
33         //和两个子节点分别对比,找出最大的节点
34         if(leftNode<size&&arr[leftNode]>arr[max]){
35             max=leftNode;
36         }
37         if(rightNode<size&&arr[rightNode]>arr[max]){
38             max=rightNode;
39         }
40         //交换位置
41         if(max!=index){
42             int temp=arr[index];
43             arr[index]=arr[max];
44             arr[max]=temp;
45             //交换位置以后,可能会破坏之前排好的堆,所以,
46             maxHeap(arr,size,max);
47         }
48         
49         
50     }
51 }
52