Day577.堆排序 -数据结构和算法Java
Posted 阿昌喜欢吃黄桃
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day577.堆排序 -数据结构和算法Java相关的知识,希望对你有一定的参考价值。
堆排序
一、介绍
二、基本思想
三、图解分析
四、代码实现
package com.achang.tree;
import java.util.Arrays;
/**
* 堆排序(升序排列:采用大顶堆方案)
*/
public class HeapSort
public static void main(String[] args)
int[] arr = 4, 6, 8, 5, 9;
heapSort(arr);
/**
* 堆排序方法
*
* @param arr 待排序的数组
*/
public static void heapSort(int[] arr)
// adjustHeap(arr,1, arr.length);
// System.out.println("第一次调整:"+ Arrays.toString(arr));//4,9,8,5,6
// adjustHeap(arr,0,arr.length);
// System.out.println("第一次调整:"+ Arrays.toString(arr));//9,6,8,5,4
int temp = 0;
for (int i = arr.length / 2 - 1; i >= 0; i--)
adjustHeap(arr, i, arr.length);
for (int i = arr.length - 1; i > 0; i--)
//交换
temp = arr[i];
arr[i] = arr[0];
arr[0] = temp;
adjustHeap(arr, 0, i);
System.out.println(Arrays.toString(arr));
/**
* 大顶堆的构造:将数组调整成一个大顶堆
*
* @param arr 待转换的数组
* @param i 表示非叶子节点在数组中的索引位置
* @param length 对多少个元素进行调整,length在逐渐的减少
*/
public static void adjustHeap(int[] arr, int i, int length)
int temp = arr[i];//取出当前元素的值
/**
* j = i * 2 + 1 中的 j 为 i节点的左子节点
*/
for (int j = i * 2 + 1; j < length; j = j * 2 + 1)
if (j + 1 < length && arr[j] < arr[j + 1]) //左子节点的值 小于 右子节点的值
j++;//j 指向右子节点
if (arr[j] > temp) //如果子节点 大于 父节点temp
arr[i] = arr[j];//把较大的值赋给当前的节点
i = j;// i指向j,继续循环比较
else
break;
//当for循环结束后,此时以i为父节点的树的最大值,已经放到了最顶上(局部的)
arr[i] = temp;//将temp的值放到调整后的位置
以上是关于Day577.堆排序 -数据结构和算法Java的主要内容,如果未能解决你的问题,请参考以下文章