堆+建堆插入删除排序+java实现
Posted 嘿boom
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆+建堆插入删除排序+java实现相关的知识,希望对你有一定的参考价值。
package testpackage; import java.util.Arrays; public class Heap { //建立大顶堆 public static void buildMaxHeap(int[] a) { for(int i=(a.length/2)-1;i>=0;i--) { adjustDown(a,i,a.length); } } //向下调整 public static void adjustDown(int[] a,int i,int len) { int temp,j; temp=a[i]; for(j=2*i+1;j<len;j=2*j+1) { //j为当前i的子节点,默认为左节点 if(j+1<len&&a[j+1]>a[j]) //如果右节点大,则选右节点 j++; if(a[j]<=temp) //若子节点都比初始值temp小,说明找到了位置 break; else { a[i]=a[j]; //如果没有终止,那么将子节点中数值大的上调至i处 i=j; //同时i下降到j这个位置 } } a[i]=temp; //将temp放在最终的位置 } //堆排序 public static void heapSort(int[] a) { buildMaxHeap(a); for(int i=a.length-1;i>=0;i--) { int temp=a[0]; a[0]=a[i]; a[i]=temp; adjustDown(a,0,i); //将剩余len-1调整为大顶堆,循环,所以用i表示 } } //向上浮动 public static void adjustUp(int[] a,int i) { int temp,j; temp=a[i]; j=(i-1)/2; while(j>=0&&a[j]<temp) { a[i]=a[j]; i=j; j=(j-1)/2; } a[i]=temp; } //插入 public static int[] insert(int[] a,int num) { int[] b=new int[a.length+1]; int i,j; i=0; j=0; while(i<a.length) b[j++]=a[i++]; b[a.length]=num; adjustUp(b,a.length); return b; } //删除(删除时有规则的,堆顶元素才会被删除) public static int[] delete(int[] a) { int temp=a[0]; a[0]=a[a.length-1]; a[a.length-1]=temp; adjustDown(a,0,a.length-1); int[] b=new int[a.length-1]; int i,j; i=j=0; while(i<a.length-1) b[j++]=a[i++]; return b; } public static void main(String[] args) { int[] a= {5,88,45,37,91,26,13,66,50}; buildMaxHeap(a); //建堆 System.out.println(Arrays.toString(a)); a=insert(a,77); //插入 System.out.println(Arrays.toString(a)); a=delete(a); //删除,只能删除堆顶元素 System.out.println(Arrays.toString(a)); heapSort(a); //排序 System.out.println(Arrays.toString(a)); } }
以上是关于堆+建堆插入删除排序+java实现的主要内容,如果未能解决你的问题,请参考以下文章