堆排序:
堆排序是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。
堆是一个近似完全二叉树的结构,并同时满足堆积的性质,即子节点的键值或索引总是小于(或者大于)它的父节点。
堆的操作:
最大堆调整:将堆末端子节点做调整,使得子节点永远小于父节点
创建最大堆:将堆中的所有数据重新排序
堆排序:移除位在第一个数据的根节点,并做最大堆调整的递归运算
Java代码实现:
import java.util.Scanner;
public class Heap_sort {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("请输入数组的大小:");
Scanner input = new Scanner(System.in);
int a = input.nextInt();
int [] arr = new int[a];
for(int i = 0;i<arr.length;i++) {
System.out.println("请输入数组的第"+i+"个值:");
int s = input.nextInt();
arr[i] = s;
}
arr = HeapSort(arr);
for(int i = 0;i<arr.length;i++)
System.out.print(" "+arr[i]+" ");
}
public static int[] HeapSort(int[] arr) {
//堆:
//完全二叉树中任何一个非叶子节点的值均不大于(或不小于)其左右孩子节点的值
//大顶堆的堆顶的关键字是所有关键字中最大的,小顶堆的堆顶的关键字是所有关键字中最小的
//是用大顶堆进行升序排序,使用小顶堆进行降序排序
//将堆的末端子节点做调整,使得子节点永远小于父节点
//将堆所有数据重新排序
//移除位在第一个数据的根节点,并做最大堆调整的递归运算
for(int i = arr.length; i > 0; i--){
arr = max_heapify(arr, i);
//堆顶元素(第一个元素)和数组中的最后一个数进行交换
int temp = arr[0];
arr[0] = arr[i-1];
arr[i-1] = temp;
}
return arr;
}
//一个大顶堆的方法
private static int[] max_heapify(int[] arr, int limit){
//从limit处节点(最后一个节点的父节点)处开始
int parentIdx = limit / 2;
for(; parentIdx >= 0; parentIdx--){
if(parentIdx * 2 >= limit)
continue;
int left = parentIdx * 2; //左子节点位置
int right = (left + 1) >= limit ? left : (left + 1); //右子节点位置,如果没有右节点,默认为左节点位置
int maxChildId = arr[left] >= arr[right] ? left : right;
if(arr[maxChildId] > arr[parentIdx]){ //交换父节点与左右子节点中的最大值
int temp = arr[parentIdx];
arr[parentIdx] = arr[maxChildId];
arr[maxChildId] = temp;
}
}
return arr;
}
}
来源:CSDN
作者:BEYONDmonster
链接:https://blog.csdn.net/BEYONDmonster/article/details/100877646