堆排序:
堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。
点击这里查看详情
知识点:封装函数;堆的排序;
注意事项: int start = (arr.length-x)/2; x=1,2结果一样,最终取得都是倒数第二层的同一个节点;其他见代码注释部分;
写作纯属个人兴趣,如有错误请批评指正!
package Java01;
import java.util.Arrays;
public class HeapSort {
//主函数入口
public static void main(String[] args){
int[] arr = new int[] {10,78,9,68,0,17,8,48,2,33};
heapSort(arr);
System.out.println(Arrays.toString(arr));
}
//多次调用maxHeap,取出第一个值,也就是最大值,放置最后
public static void heapSort(int[] arr){
//定义开始位置,最后一个非叶子节点
int start = (arr.length-1)/2;
//调整为大顶锥
for(int i=start;i>=0;i--){
maxHeap(arr, arr.length, i );
}
for(int i = arr.length-1;i>0;i--){
int temp = arr[0];
arr[0]=arr[i];
arr[i]=temp;
maxHeap(arr,i,0);
}
}
// 参数主要有 数组,数组长度,索引
public static void maxHeap(int[] arr,int size,int index){
//左子节点
int leftNode = 2*index + 1;
//右子节点
int rightNode = 2*index + 2;
//暂且默认该节点为最大值,与自己的左右节点进行比较
int max = index;
if(size>leftNode&&arr[leftNode]>arr[max]){
max = leftNode;
}
if(size>rightNode&&arr[rightNode]>arr[max]){
max = rightNode;
}
//此处若发生交换,必定破坏了原有堆的结构,需要调整
if(max!=index) {
int temp=arr[index];
arr[index]=arr[max];
arr[max]=temp;
//调整,此时的max指向左节点或者右节点
maxHeap(arr,size,max);
}
}
}