import java.util.Arrays;
//nlogn
public class HeapSort {
public static void main(String[] args)
{
//要求将数组进行升序排序
int[] arr={4,6,8,5,9};
heapSort(arr);
}
//编写一个堆排序的方法
public static void heapSort(int[] arr)
{
int temp=0;
System.out.println("堆排序");
//分步完成、
/* adjustHeap(arr,1,arr.length);
System.out.println("第一次"+ Arrays.toString(arr));
adjustHeap(arr,0,arr.length);
System.out.println("第二次"+ Arrays.toString(arr));*/
//完成最终代码
//变成大小堆
for(int i=arr.length/2-1;i>=0;i--)
{
adjustHeap(arr,i,arr.length);
}
System.out.println( Arrays.toString(arr));
//交换最大的和末尾的 并调整
for(int j=arr.length-1;j>0;j--)
{
//交换
temp=arr[j];
arr[j]=arr[0];
arr[0]=temp;
adjustHeap(arr,0,j);
}
System.out.println(Arrays.toString(arr));
}
//将一个数组(二叉树),调整成一个大顶堆
/**
*功能:完成 将以i对应的非叶子节点的数调整成大顶堆
* 举例 arr={4,6,8,5,9};=> i=1 4 9 8 5 6
* 如果我们再次调用 adjustHeap 传入的是i =0 调整成真正的第一颗大顶堆 9 6 8 5 4
* @param arr 待调整的数组
* @param i 表示非叶子节点的在数组中的索引
* @param length 表示对多少个元素进行调整,length是在逐渐减少
*/
public static void adjustHeap(int []arr,int i,int length)
{
int temp=arr[i];//先取出当前元素的值 ,保存临时变量
//开始调整
//说明 k=i*2+1 是 i指向的左子节点
for(int k=i*2+1;k<length;k=k*2+1)
{
if(k+1<length&&arr[k]<arr[k+1])
{
//说明左子节点的值小于右子节点
k++;//k指向右子节点
}
if(arr[k]>temp)
{
//如果子节点大于父节点
arr[i]=arr[k]; //把较大的值赋给当前节点
i=k;//!!!!!!让i指向k 继续循环比较
}
else
{
break;//!!因为是从下往上,从左往右调整的 所以最下面的数已经调整好
}
}
//当 for 循环结束后 已经将以 i为父节点的最大值 放在了最顶上(局部)
arr[i]=temp;//将temp放在调整后的位置
}
}
堆排序
最新推荐文章于 2023-09-21 13:21:58 发布