數據結構和算法——二叉樹應用之堆排序

1、預備知識

  • 利用大頂堆進行升序排序
    不多說,先看看大頂堆長什麼鳥樣
    特徵就是對於每一個局部二叉樹,父節點總是大於左右子節點,左右節點的大小沒有關係。
    小頂堆同理。
    在這裏插入圖片描述

  • 二叉樹和數組的關係:上面的二叉樹可以轉換成相應的數組是[90,80,70,60,50,60,20,10],具體怎麼轉化,苦於自身口技,大家就自己查資料吧

2、開始排序

2.1、基本思想:

對於算法,思想纔是精髓。
1)將待排序的數組構造成大頂堆,整個序列的最大值就是堆頂;
2)將堆頂元素與序列的末尾元素進行交換,此時末尾爲最大值,其不參與後面的排序;
3)將剩餘的n-1個元素狗造成一個大頂堆,這樣就得到了次小值,反覆2,3操作,便可得到一個升序序列;

2.2、調整局部二叉樹

對 下表爲1的根節點進行調整

調整根節點爲1的局部二叉樹
對應的代碼

/**
     * 對局部二叉樹進行調整
     * @param arr
     * @param i
     * @param len
     */
    public static void adjustHeap(int[] arr, int i, int len){

        int temp = arr[i];
        for (int j = 2*i+1; j < len ; j = j*2+1) {
//            右子樹不能越界
            if (j+1 < len && arr[j] < arr[j+1]) {
                j++;
            }
            //交換父節點和葉子節點
            if (arr[j] > temp){
                arr[i] = arr[j];
                i = j;
            }else {
                break;
            }
        }
        arr[i] = temp;
    }

2.2、構建大頂堆和進行排序


	//1)將待排序的數組構造成大頂堆,整個序列的最大值就是堆頂;
	//2)將堆頂元素與序列的末尾元素進行交換,此時末尾爲最大值,其不參與後面的排序;
	//3)將剩餘的n-1個元素狗造成一個大頂堆,這樣就得到了次小值,反覆2,3操作,便可得到一個升序序列;
public static void heapSort(int[] arr){
        int temp = 0;
        //調用上面的方法,調整爲大頂堆
        for (int i = arr.length/2-1 ; i >= 0; i--) {
            adjustHeap(arr,i,arr.length);
        }
		
        for (int j = arr.length-1; j > 0 ; j--) {
            temp = arr[j];
            arr[j] = arr[0];
            arr[0] = temp;
            adjustHeap(arr,0,j);
        }
    }

測試結果

		int[] arr = {4,6,8,5,9,35,56,3,2};
        System.out.println("原始數組:"+Arrays.toString(arr));
        heapSort(arr);
        System.out.println("排序後數組:"+Arrays.toString(arr));

在這裏插入圖片描述

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