java   堆排序 实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java   堆排序 实现相关的知识,希望对你有一定的参考价值。



堆排序啊,其实是一种数据结构,二叉树,二叉树分为是满二叉树和完全二叉树。一棵深度为 k,且有 2k - 1 个节点称之为满二叉树,完全二叉树:深度为 k,有 n 个节点的二叉树,当且仅当其每一个节点都与深度为 k 的满二叉树中序号为 1 至 n 的节点对应时,称之为完全二叉树。

话收回来,堆呢,有最大堆,最小堆,最大堆是子节点没有比父节点小的,最小堆则相反。下面是堆排序,可以自己画一个草图自己画画,堆排序的过程。


package com.test1;


//堆排序

public class HeapSortFinal {


public static void main(String[] args) {

int[] array = { 19, 38, 7, 36, 5, 5, 3, 2, 1, 0, 56 };


System.out.println("排序前:");

for (int i = 0; i < array.length; i++) {

System.out.print(array[i] + ",");

}


System.out.println();

System.out.println("分割线---------------");


heapSort(array);


System.out.println("排序后:");

for (int i = 0; i < array.length; i++) {

System.out.print(array[i] + ",");

}

}


public static void heapSort(int[] array) {

if (array == null || array.length == 1)

return;


buildMaxHeap(array); // 第一次排序,构建最大堆,只保证了堆顶元素是数组里最大的


for (int i = array.length - 1; i >= 1; i--) {

// 这个是什么意思呢?,经过上面的一些列操作,目前array[0]是当前数组里最大的元素,需要和末尾的元素交换

// 然后,拿出最大的元素

swap(array, 0, i);


// 交换完后,下次遍历的时候,就应该跳过最后一个元素,也就是最大的那个值,然后开始重新构建最大堆

// 堆的大小就减去1,然后从0的位置开始最大堆

maxHeap(array, i, 0);

}

}


// 构建堆

public static void buildMaxHeap(int[] array) {

if (array == null || array.length == 1)

return;


// 堆的公式就是 int root = 2*i, int left = 2*i+1, int right = 2*i+2;

int cursor = array.length / 2;

for (int i = cursor; i >= 0; i--) { // 这样for循环下,就可以第一次排序完成

maxHeap(array, array.length, i);

}

}


// 最大堆

public static void maxHeap(int[] array, int heapSieze, int index) {

int left = index * 2 + 1; // 左子节点

int right = index * 2 + 2; // 右子节点

int maxValue = index; // 暂时定在Index的位置就是最大值


// 如果左子节点的值,比当前最大的值大,就把最大值的位置换成左子节点的位置

if (left < heapSieze && array[left] > array[maxValue]) {

maxValue = left;

}


// 如果右子节点的值,比当前最大的值大,就把最大值的位置换成右子节点的位置

if (right < heapSieze && array[right] > array[maxValue]) {

maxValue = right;

}


// 如果不相等,说明啊,这个子节点的值有比自己大的,位置发生了交换了位置

if (maxValue != index) {

swap(array, index, maxValue); // 就要交换位置元素


// 交换完位置后还需要判断子节点是否打破了最大堆的性质。最大堆性质:两个子节点都比父节点小。

maxHeap(array, heapSieze, maxValue);

}

}


// 数组元素交换

public static void swap(int[] array, int index1, int index2) {

int temp = array[index1];

array[index1] = array[index2];

array[index2] = temp;

}


}


本文出自 “10093778” 博客,请务必保留此出处http://10103778.blog.51cto.com/10093778/1915183

以上是关于java   堆排序 实现的主要内容,如果未能解决你的问题,请参考以下文章

堆排序算法的java实现

java   堆排序 实现

基础排序算法,java实现(快速,冒泡,选择,堆排序,插入)

java 各类排序数组实现

排序算法:堆排序-Java实现

JAVA实现经典排序算法(冒泡排序选择排序插入排序希尔排序堆排序归并排序快速排序)