排序算法选择排序---堆排序
Posted axu521
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法选择排序---堆排序相关的知识,希望对你有一定的参考价值。
概念:利用树结构进行排序。
分类: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
以上是关于排序算法选择排序---堆排序的主要内容,如果未能解决你的问题,请参考以下文章
排序算法学习(直接插入排序,希尔排序,选择排序,堆排序,冒泡排序)
常见排序算法的实现(归并排序快速排序堆排序选择排序插入排序希尔排序)