Java八大排序---堆排序

堆排序:
堆排序是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。
堆是一个近似完全二叉树的结构,并同时满足堆积的性质,即子节点的键值或索引总是小于(或者大于)它的父节点。

堆的操作:
最大堆调整:将堆末端子节点做调整,使得子节点永远小于父节点
创建最大堆:将堆中的所有数据重新排序
堆排序:移除位在第一个数据的根节点,并做最大堆调整的递归运算

在这里插入图片描述

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;
	}
}   
发布了40 篇原创文章 · 获赞 2 · 访问量 3399

猜你喜欢

转载自blog.csdn.net/BEYONDmonster/article/details/100877646