堆排序
Java中PriorityQueue通过二叉小顶堆实现
PriorityQueue<Integer> pq = new PriorityQueue<>(); // 小顶堆
for (int val : nums) {
pq.add(val);
堆排序
大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]
小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]
堆排序的基本思想是:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了
大顶堆为升序排序,小顶堆为降序排序
package LeetCodeDay1;
import javax.naming.ldap.SortControl;
public class HeapSorted {
public static void main(String[] args) {
int[] arr={7,6,7,11,52,14};
Sort(arr);
}
private static void Sort(int[] arr) {
//从非叶子节点构造大顶堆
for(int i=arr.length/2-1;i>=0;i--){
adjustHeap(arr,i,arr.length);
}
//调整大顶堆+交换堆顶和尾端元素排序
for(int j=arr.length-1;j>0;j--){
swap(arr,0,j);
adjustHeap(arr, 0, j);
}
}
private static void swap(int[] a, int i, int j) {
// TODO Auto-generated method stub
int temp=a[i];
a[j]=a[i];
a[i]=temp;
}
//
private static void adjustHeap(int[] arr, int i, int length) {
// TODO Auto-generated method stub
int temp=arr[i];
//一直调整到不能调整为止
for(int k=i*2+1;k<length;k=k*2+1){
//找到子节点中最大的元素
if(k+1<length&&arr[k]<arr[k+1]){
k++;
}
//比较父节点与子节点
if(arr[k]>temp){
arr[i]=arr[k];
}else {
break;
}
}
arr[i]=temp;//将temp值放到最终位置
}
}