首页 > 代码库 > 二叉堆

二叉堆

import java.util.Scanner ;public class HeapSort{	int[] h ;	int n ;	public void swap(int[] array, int x, int y){        //简单的交换函数;		int t = array[x] ;		array[x] = array[y] ;		array[y] = t ;	}	public void siftDown(int i){                       //下滤;一般在删除最小或最大元素后,将最后一个元素放到根节点的位置,进行下滤操作,以保持堆的堆序性;		boolean flag = true ;		while(2*i<=n && flag == true){			int t ;			if (h[i]>h[i*2]) {				t = i*2 ;			}else{				t = i ;			}			if (i*2+1<=n) {				if (h[t]>h[i*2+1]) {					t = i*2+1 ;				}			}			if (t!=i) {				swap(h,i,t) ;				i = t ;			}else{				flag = false ;			}		}	}	public void siftDown02(int i){               //下滤操作,递归版本;		if(2*i<=n){			int t ;			if (h[i]>h[i*2]) {				t = i*2 ;			}else{				t = i ;			}			if (i*2+1<=n) {				if (h[t]>h[i*2+1]) {					t = i*2+1 ;				}			}			if (t!=i) {				swap(h,i,t) ;				siftDown02(t) ;			}		}	}		public void siftUp(int i){               //上滤,一般在最后位置插入新元素后,通过上滤操作,以维持堆的堆序性;		boolean flag = true ;		if (i!=1) {			while(i!=1 && flag == true){				if (h[i] < h[i/2]) {					swap(h,i,i/2) ;				}else{					flag = false ;				}				i = i/2 ;			}		}	}	public void siftUp02(int i){            //上滤操作,递归版本;		if (i!=1) {			if (h[i] < h[i/2]) {				swap(h,i,i/2) ;				siftUp(i/2) ;			}					}		}	public void insert(int value){           //插入操作;		n++ ;		h[n] = value ;		siftUp(n) ;	}	public void createHeap(){                 //创建堆;		for (int i=n/2;i>=1;i--) {			siftDown02(i) ;		}	}	public int deleteMin(){                    //删除最小元素;		int t = h[1] ;		h[1] = h[n] ;		n-- ;		siftDown02(1) ;		return t ;	}	public static void main(String[] args){         //测试;		HeapSort hs = new HeapSort() ;		hs.h= new int[101] ;				System.out.println("please input ‘n =‘:") ;		Scanner sc = new Scanner(System.in) ;		int num = sc.nextInt() ;		for (int i=1;i<=num;i++) {			hs.h[i] = sc.nextInt() ;		}		hs.n = num ;		hs.createHeap() ;		hs.insert(45) ;		while(hs.n>=1){			System.out.print(hs.deleteMin() + " ") ;					}		System.out.println() ;			}}

二叉堆