堆排序-java
Posted 旧时星空
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆排序-java相关的知识,希望对你有一定的参考价值。
堆排序
利用堆这种数据结构而设计的一种排序算法,是一种选择排序,他的最好,最坏,平均时间复杂度均为nlogn,是不稳定的排序
堆是具有以下性质的完全二叉树:每个节点的值都大于或等于其左右孩子节点的值,称为大顶堆,注意没有要求节点的左孩子的值和右孩子的值的大小关系
每个结点的值都小于或等于左右孩子结点的值,称为小顶堆
一般升序采用大顶堆,降序采用小顶堆
堆排序基本思路:
1.将无需序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆
2.将堆顶元素与末尾元素交换,将最大元素沉到数组末端
3.重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,直到整个序列有序
public class dui
public static void main(String[] args)
int arr[]= 4,6,8,5,9;
//编写一个堆排序的方法
public static void heapSort(int arr[])
System.out.println("堆排序!");
int temp=0;
for(int i=arr.length/2-1;i>=0;i--)
adjustHeap(arr,i,arr.length);
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));
public static void adjustHeap(int arr[],int i,int length)
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];//把较大的值赋给当前结点
i=k;//i指向k,继续循环比较
else
break;
//当for 循环结束后我们已经将以i为父结点的树的最大值,放在了最顶(局部)
arr[i]=temp;//将temp值放到调整后的位置
以上是关于堆排序-java的主要内容,如果未能解决你的问题,请参考以下文章