標籤:void print class 迴圈 turn util str 實現 std
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實現