1. 程式人生 > 實用技巧 >python學習筆記1 -- 函數語言程式設計之高階函式

python學習筆記1 -- 函數語言程式設計之高階函式

堆排序

  堆排序是利用這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為O(nlogn),它也是不穩定排序。首先簡單瞭解下堆結構。

'''堆'''是具有以下性質的完全二叉樹:每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆;或者每個結點的值都小於或等於其左右孩子結點的值,稱為小頂堆

  堆排序的基本思想是:將待排序序列構造成一個大頂堆,此時,整個序列的最大值就是堆頂的根節點。將其與末尾元素進行交換,此時末尾就為最大值。然後將剩餘n-1個元素重新構造成一個堆,這樣會得到n個元素的次小值。如此反覆執行,便能得到一個有序序列了

堆排序首先進行建堆

建堆完成後進行排序

大致步驟

a.將無需序列構建成一個堆,根據升序降序需求選擇大頂堆或小頂堆;

b.將堆頂元素與末尾元素交換,將最大元素"沉"到陣列末端;

c.重新調整結構,使其滿足堆定義,然後繼續交換堆頂元素與當前末尾元素,反覆執行調整+交換步驟,直到整個序列有序。

    public static void heapSort( int []arr){
        //將資料整理成大頂堆
        for (int i=arr.length/2-1;i>=0;i--){
            buildHeapSort(arr,i,arr.length);
        }

        for (int j=arr.length-1;j>0;j--){
            //把堆頂元素放到陣列最後
            swap(arr,0,j);
            //堆頂放入陣列結尾後 自上而下重新調整陣列 建立新的大頂堆
            buildHeapSort(arr,0,j);
        }
    }

    /**
     * 整個堆排序最關鍵的地方
     *
     * @param arr    待組堆
     * @param start  起始結點
     * @param length 堆的長度
     */
    public static void buildHeapSort(int[] arr, int start, int length) {
        int temp = arr[start];
        //從上到下 將小數下沉到堆底
        for (int i = 2 * start + 1; i < length; i = 2 * i + 1) {
            //判斷左右孩子節點的大小
            if (i + 1 < length && arr[i] < arr[i + 1]) {
                i++;
            }
            //父節點與大於父節點的孩子節點進行交換
            if (temp < arr[i]) {
                swap(arr, start, i);
                start = i;
            } else {
                break; //父節點大於它的左節點和右節點
            }
        }


    }
//用於交換  
public static void swap(int[] arr, int x, int y) {
        int tem = arr[x];
        arr[x] = arr[y];
        arr[y] = tem;
    }