小根堆排序
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);
}
}
}