1.堆排序就是,先从无序数组构建大根堆。
2.再将堆顶元素与数组最后一个元素交换,再从当前的i交换
//堆排序,1.先构建堆 2.再将堆顶与末尾交换,3.再重新调整堆,时间复杂度不论好坏都为 O(nlogn)
public static void Heapsort(int[] arr){
//1.构建堆
for(int i = arr.length/2-1;i>=0;i--)
{
adjustHeap(arr,i,arr.length);
}
//for 交换堆顶元素,再调整
for(int j = arr.length-1;j>0;j--)
{
swap(arr,0,j);
adjustHeap(arr,0,j);
}
}
/**
* 调整大顶堆(仅是调整过程,建立在大顶堆已构建的基础上)
* @param arr
* @param i
* @param length
*/
public static void adjustHeap(int []arr,int i,int length){
//怎么调整呢?
//把当前元素存下来
int temp = arr[i];
//
for(int j = i*2+1;j<length;j = j*2+1) {
if(j+1<length && arr[j]<arr[j+1])
j++;
if(arr[j] > temp) {
arr[i] = arr[j];
i = j;
}else{
break;
}
}
arr[i] = temp;
}
/*
小顶堆排序尝试
*/
public static void Heapsorts(int[] arr){
//1.构建堆
for(int i = arr.length/2-1;i>=0;i--)
{
adjustHeaps(arr,i,arr.length);
}
//for 交换堆顶元素,再调整
for(int j = arr.length-1;j>0;j--)
{
swap(arr,0,j);
adjustHeaps(arr,0,j);
}
}
//小顶堆,堆排序
public static void adjustHeaps(int []arr,int i,int length){
//怎么调整呢?
//把当前元素存下来
int temp = arr[i];
//
for(int j = i*2+1;j<length;j = j*2+1) {
if(j+1<length && arr[j]>arr[j+1])
j++;
if(arr[j] < temp) {
arr[i] = arr[j];
i = j;
}else{
break;
}
}
arr[i] = temp;
}
/* 交换元素
* @param arr
* @param a
* @param b
*/
public static void swap(int []arr,int a ,int b){
int temp=arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
public static void main(String[] args) {
int []arr = {9,8,7,6,5,4,3,2,1};
Heapsorts(arr);
for(int a:arr)
System.out.println(a);
}