容易理解的堆排序代码(JAVA)

容易理解的堆排序代码(JAVA)
容易理解的堆排序代码(JAVA)
容易理解的堆排序代码(JAVA)

import java.util.Scanner;  
 
public class Heap {  
  
    private int[] data;  
  
    /*输入数组元素,数组下标从1开始*/  
    public void input() {  
        System.out.println("请输入数组大小");  
        Scanner scanner = new Scanner(System.in);  
        int n = scanner.nextInt();  
        data = new int[n + 1];  
        System.out.println("输入数组元素");  
        for (int i = 1; i <= data.length-1; i++) {  
            data[i] = scanner.nextInt();  
        }  
        System.out.println("输入完成");  
    }  
      
   //测试数据:
   //第一组:1 7 9 3 10 16 4 14 2 8
  //第二组:17 8 84 2 45 94
   //第三组:10 32 1 9 5 7 12 0 4
   public static void main(String args[]){
          Heap h=new Heap();
               h.input();
           System.out.println("堆排序前:");
               h.print();
               h.heapSort();
          System.out.println("堆排序后:");
              h.print();
  }


    /** 
     * 调整堆,使其满足堆得定义 
     * @param i 
     * @param n 
     */  
    public void adjust(int i, int n) {  
        
        int child;  
        for (; i <= n / 2; ) {  
            child = i * 2;  
           // System.out.println("child="+child);
            if(child+1<=n&&data[child]<data[child+1])  
                child+=1;/*使child指向值较大的孩子*/  
            if(data[i]<data[child]){  
                swap(i, child);  
                /*交换后,以child为根的子树不一定满足堆定义,所以从child处开始调整*/  
                i = child;  
               
            }  else break;
        }  
    }  
  
    public void heapSort() {  
        /*根据树的性质建堆,树节点前一半一定是分支节点,所以我们从这里开始调整出初始堆*/  
        for (int i = data.length / 2; i > 0; i--)  
            adjust(i, data.length-1);  

        System.out.println("调整后的初始堆:");
            print();
        for (int i = data.length-1; i > 0; i--) {  
            /*把根节点跟最后一个元素交换位置,调整剩下的n-1个节点,即可排好序*/  
            swap(1, i);  
            adjust(1, i - 1);  
        }  
    }  
  
    public void swap(int i, int j) {  
        int temp = data[i];  
        data[i] = data[j];  
        data[j] = temp;  
    }  
  
    public void print() {  
        for (int i = 1; i < data.length; i++) {  
            System.out.print(data[i]+" ");  
        }  
        System.out.println();  
    }  
  
}  


运行:
请输入数组大小
10
输入数组元素
1 7 9 3 10 16 4 14 2 8
输入完成
堆排序前:
1 7 9 3 10 16 4 14 2 8
调整后的初始堆:
16 14 9 7 10 1 4 3 2 8
堆排序后:
1 2 3 4 7 8 9 10 14 16

下载源码:

你可能感兴趣的:(java)