概述:
堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。
使用参数计算:
父节点个数=(数组的长度-1)/2
父节点的索引:父节点的个数 =>1
子节点的索引:①左儿子:2*父节点索引 ②右儿子:左儿子索引+1
步骤:
1. 把堆中最大值放到堆节点上(从后往前检索父节点)
1.1 判断是否存在右儿子
1.2 比较左儿子和右儿子大小(1.1和1.2可以再一个判断中进行)
1.3 与父节点进行比较,若比父节点大则进行交换
for (int i=f;i>0;i--){
int index = 2*i;
// 1.1 找最大的儿子,首先要判断右儿子是否存在2(如果存在子节点右儿子是一定存在的)
if((index+1)<size&&arr[index]<arr[index+1]){
index++;
}
// 1.2 找出来与父亲进行比较,如果比父亲大则进行交换
if (arr[index]>arr[i]){
temp = arr[index];
arr[index] = arr[i];
arr[i] = temp;
}
}
2. 将选出来的堆节点与最后一个节点进行交换,使最大值放在最后
temp = arr[1];
arr[1] = arr[size-1];
arr[size-1] = temp;
3. 缩短数组长度重复1、2步骤
size--;
4. 将1、2、3步放入循环中实现整个数组进行排序
while(size>2)
5. 遍历排序后的整个数组
for (int i=1;i<arr.length;i++){
System.out.print(arr[i] +" ");
}
总结:
堆排序并不是很高效!
源代码:
package com.suanfa.domin;
/**
* 对数组进行堆排序
*/
public class DuiSortArray {
public static void main(String[] args) {
int[] arr = {0,3,5,6,7,2,4,9,8,11,55};
int size = arr.length;
while(size>2){
int f = (size-1)/2;
int temp;
// 1. 把最大的节点放在最初的堆节点上
for (int i=f;i>0;i--){
int index = 2*i;
// 1.1 找最大的儿子,首先要判断右儿子是否存在2(如果存在子节点右儿子是一定存在的)
if((index+1)<size&&arr[index]<arr[index+1]){
index++;
}
// 1.2 找出来与父亲进行比较,如果比父亲大则进行交换
if (arr[index]>arr[i]){
temp = arr[index];
arr[index] = arr[i];
arr[i] = temp;
}
}
// 2. 把选出来的最大的根节点与末尾最后一个节点进行交换
temp = arr[1];
arr[1] = arr[size-1];
arr[size-1] = temp;
// 3. 通过缩短数组的长度实现对所有节点的排序
size--;
}
for (int i=1;i<arr.length;i++){
System.out.print(arr[i] +" ");
}
}
}