堆排序-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的主要内容,如果未能解决你的问题,请参考以下文章

Java堆排序

Java堆排序

堆排序Java实现

堆排序及java版实现

堆排序Java实现

Java实现堆排序和计数排序