堆排序

小根堆排序

import java.math.* ;
import java.util.* ;

/**
 * 
 */
public class Test extends Base{
	public static void main(String[] args) {
		int[] arr = getRandomArr() ;
		println(arr); 
		makeMinHeap(arr , 10);
		println(arr); 
		minHeapSortDesc(arr,10);
		println(arr);
		println();		
	}

	public static void minHeapSortDesc(int[] arr, int n){
		
		for (int i = n - 1 ; i >= 1 ; i-- ){
			int temp = arr[i] ;
			arr[i] = arr[0] ;
			arr[0] = temp ;
			minHeapFixdown(arr , 0 , i);
		}
	}

	public static void makeMinHeap(int[] arr, int n){
		for (int i = n / 2 -1; i >= 0 ;i-- ){
			minHeapFixdown(arr, i , n);
		}
	}

	public static void minHeapFixdown(int[] arr, int i , int n){
		int j , temp ;
		temp = arr[i] ;
		j = 2 * i + 1; 
		while(j < n){
			if(j+1 < n && arr[j+1] < arr[j]){
				j++ ;
			}
			if(arr[j] >= temp ){
				break ;
			}
			arr[i] = arr[j] ;
			i = j ;
			j = i * 2 + 1;
		}
		arr[i] = temp ;
	}

}




大根堆排序

import java.math.* ;
import java.util.* ;

/**
 * 
 */
public class Test extends Base{
	public static void main(String[] args) {
		int[] arr = getRandomArr() ;

		println(arr); 
		makeMaxHeap(arr , 10) ;
		println(arr); 
		maxHeapAsc(arr , 10);
		println(arr);
		println();		
	}
	
	public static void makeMaxHeap(int[] arr , int n){
		for (int i = n / 2 -1; i  >= 0 ; i--){
			ajustMaxHeap(arr , i , n);
		}
	}
	/**
	 * 對於所有的葉子節點可以認爲已經在堆中擁有正確的位置,
	 * 只需要調整非葉子節點使其到達正確的位置就可以了。
	 */
	public static void ajustMaxHeap(int[] arr , int i , int n){ 
		int temp = arr[i] ; 
		int father = i ;
		int child = 2 * father + 1 ; 
		if(child >= n) return ;
		/* 找到子節點中較大的 */
		if( child + 1 < n && arr[child] <  arr[child + 1]){
			child++ ;
		}
		/* 如果父節點小於子節點,交換兩個數的位置 */
		if(arr[father] < arr[child]){ 
			arr[father] = arr[child] ;
			arr[child] = temp ;
		} 
		ajustMaxHeap(arr , child , n);
	}


	public static void maxHeapAsc(int[] arr , int n){
		int temp ;
		for (int i = n - 1; i > 0; i--){
			temp = arr[0] ;
			arr[0] = arr[i];
			arr[i] = temp ;
			ajustMaxHeap(arr , 0 , i);
		}
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章