排序算法选择排序---堆排序

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          

 

以上是关于排序算法选择排序---堆排序的主要内容,如果未能解决你的问题,请参考以下文章

算法排序之堆排序

排序算法学习(直接插入排序,希尔排序,选择排序,堆排序,冒泡排序)

常见排序算法的实现(归并排序快速排序堆排序选择排序插入排序希尔排序)

九种经典排序算法详解(冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序,计数排序,桶排序,基数排序)

经典排序算法一从简单选择排序到堆排序的深度解析

简易学算法之堆排序