亚洲最大看欧美片,亚洲图揄拍自拍另类图片,欧美精品v国产精品v呦,日本在线精品视频免费

  • 站長資訊網(wǎng)
    最全最豐富的資訊網(wǎng)站

    1.7 堆排序

    堆排序(Heapsort)是指利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計的一種排序算法。堆積是一個近似完全二叉樹的結(jié)構(gòu),并同時滿足堆積的性質(zhì):即子結(jié)點的鍵值或索引總是小于(或者大于)它的父節(jié)點。堆排序可以說是一種利用堆的概念來排序的選擇排序。分為兩種方法:

    1. 大頂堆:每個節(jié)點的值都大于或等于其子節(jié)點的值,在堆排序算法中用于升序排列;
    2. 小頂堆:每個節(jié)點的值都小于或等于其子節(jié)點的值,在堆排序算法中用于降序排列;

    堆排序的平均時間復(fù)雜度為 Ο(nlogn)。

    1. 算法步驟

    1. 創(chuàng)建一個堆 H[0……n-1];

    2. 把堆首(最大值)和堆尾互換;

    3. 把堆的尺寸縮小 1,并調(diào)用 shift_down(0),目的是把新的數(shù)組頂端數(shù)據(jù)調(diào)整到相應(yīng)位置;

    4. 重復(fù)步驟 2,直到堆的尺寸為 1。

    2. 動圖演示

    1.7 堆排序

    1.7 堆排序


    代碼實現(xiàn)

    JavaScript

    實例

    var len;    // 因為聲明的多個函數(shù)都需要數(shù)據(jù)長度,所以把len設(shè)置成為全局變量

    function buildMaxHeap(arr) {   // 建立大頂堆
        len = arr.length;
        for (var i = Math.floor(len/2); i >= 0; i) {
            heapify(arr, i);
        }
    }

    function heapify(arr, i) {     // 堆調(diào)整
        var left = 2 * i + 1,
            right = 2 * i + 2,
            largest = i;

        if (left < len && arr[left] > arr[largest]) {
            largest = left;
        }

        if (right < len && arr[right] > arr[largest]) {
            largest = right;
        }

        if (largest != i) {
            swap(arr, i, largest);
            heapify(arr, largest);
        }
    }

    function swap(arr, i, j) {
        var temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    function heapSort(arr) {
        buildMaxHeap(arr);

        for (var i = arr.length1; i > 0; i) {
            swap(arr, 0, i);
            len–;
            heapify(arr, 0);
        }
        return arr;
    }

    Python

    實例

    def buildMaxHeap(arr):
        import math
        for i in range(math.floor(len(arr)/2),1,1):
            heapify(arr,i)

    def heapify(arr, i):
        left = 2*i+1
        right = 2*i+2
        largest = i
        if left < arrLen and arr[left] > arr[largest]:
            largest = left
        if right < arrLen and arr[right] > arr[largest]:
            largest = right

        if largest != i:
            swap(arr, i, largest)
            heapify(arr, largest)

    def swap(arr, i, j):
        arr[i], arr[j] = arr[j], arr[i]

    def heapSort(arr):
        global arrLen
        arrLen = len(arr)
        buildMaxHeap(arr)
        for i in range(len(arr)1,0,1):
            swap(arr,0,i)
            arrLen –=1
            heapify(arr, 0)
        return arr

    Go

    實例

    func heapSort(arr []int) []int {
            arrLen := len(arr)
            buildMaxHeap(arr, arrLen)
            for i := arrLen 1; i >= 0; i {
                    swap(arr, 0, i)
                    arrLen -= 1
                    heapify(arr, 0, arrLen)
            }
            return arr
    }

    func buildMaxHeap(arr []int, arrLen int) {
            for i := arrLen / 2; i >= 0; i {
                    heapify(arr, i, arrLen)
            }
    }

    func heapify(arr []int, i, arrLen int) {
            left := 2*i + 1
            right := 2*i + 2
            largest := i
            if left < arrLen && arr[left] > arr[largest] {
                    largest = left
            }
            if right < arrLen && arr[right] > arr[largest] {
                    largest = right
            }
            if largest != i {
                    swap(arr, i, largest)
                    heapify(arr, largest, arrLen)
            }
    }

    func swap(arr []int, i, j int) {
            arr[i], arr[j] = arr[j], arr[i]
    }

    Java

    實例

    public class HeapSort implements IArraySort {

        @Override
        public int[] sort(int[] sourceArray) throws Exception {
            // 對 arr 進行拷貝,不改變參數(shù)內(nèi)容
            int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

            int len = arr.length;

            buildMaxHeap(arr, len);

            for (int i = len 1; i > 0; i) {
                swap(arr, 0, i);
                len–;
                heapify(arr, 0, len);
            }
            return arr;
        }

        private void buildMaxHeap(int[] arr, int len) {
            for (int i = (int) Math.floor(len / 2); i >= 0; i) {
                heapify(arr, i, len);
            }
        }

        private void heapify(int[] arr, int i, int len) {
            int left = 2 * i + 1;
            int right = 2 * i + 2;
            int largest = i;

            if (left < len && arr[left] > arr[largest]) {
                largest = left;
            }

            if (right < len && arr[right] > arr[largest]) {
                largest = right;
            }

            if (largest != i) {
                swap(arr, i, largest);
                heapify(arr, largest, len);
            }
        }

        private void swap(int[] arr, int i, int j) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }

    }

    PHP

    實例

    function buildMaxHeap(&$arr)
    {
        global $len;
        for ($i = floor($len/2); $i >= 0; $i) {
            heapify($arr, $i);
        }
    }

    function heapify(&$arr, $i)
    {
        global $len;
        $left = 2 * $i + 1;
        $right = 2 * $i + 2;
        $largest = $i;

        if ($left < $len && $arr[$left] > $arr[$largest]) {
            $largest = $left;
        }

        if ($right < $len && $arr[$right] > $arr[$largest]) {
            $largest = $right;
        }

        if ($largest != $i) {
            swap($arr, $i, $largest);
            heapify($arr, $largest);
        }
    }

    function swap(&$arr, $i, $j)
    {
        $temp = $arr[$i];
        $arr[$i] = $arr[$j];
        $arr[$j] = $temp;
    }

    function heapSort($arr) {
        global $len;
        $len = count($arr);
        buildMaxHeap($arr);
        for ($i = count($arr) 1; $i > 0; $i) {
            swap($arr, 0, $i);
            $len–;
            heapify($arr, 0);
        }
        return $arr;
    }

    C

    實例

    #include <stdio.h>
    #include <stdlib.h>

    void swap(int *a, int *b) {
        int temp = *b;
        *b = *a;
        *a = temp;
    }

    void max_heapify(int arr[], int start, int end) {
        // 建立父節(jié)點指標和子節(jié)點指標
        int dad = start;
        int son = dad * 2 + 1;
        while (son <= end) { // 若子節(jié)點指標在範圍內(nèi)才做比較
            if (son + 1 <= end && arr[son] < arr[son + 1]) // 先比較兩個子節(jié)點大小,選擇最大的
                son++;
            if (arr[dad] > arr[son]) //如果父節(jié)點大於子節(jié)點代表調(diào)整完畢,直接跳出函數(shù)
                return;
            else { // 否則交換父子內(nèi)容再繼續(xù)子節(jié)點和孫節(jié)點比較
                swap(&arr[dad], &arr[son]);
                dad = son;
                son = dad * 2 + 1;
            }
        }
    }

    void heap_sort(int arr[], int len) {
        int i;
        // 初始化,i從最後一個父節(jié)點開始調(diào)整
        for (i = len / 2 1; i >= 0; i)
            max_heapify(arr, i, len 1);
        // 先將第一個元素和已排好元素前一位做交換,再重新調(diào)整,直到排序完畢
        for (i = len 1; i > 0; i) {
            swap(&arr[0], &arr[i]);
            max_heapify(arr, 0, i 1);
        }
    }

    int main() {
        int arr[] = { 3, 5, 3, 0, 8, 6, 1, 5, 8, 6, 2, 4, 9, 4, 7, 0, 1, 8, 9, 7, 3, 1, 2, 5, 9, 7, 4, 0, 2, 6 };
        int len = (int) sizeof(arr) / sizeof(*arr);
        heap_sort(arr, len);
        int i;
        for (i = 0; i < len; i++)
            printf("%d ", arr[i]);
        printf("n");
        return 0;
    }

    C++

    實例

    #include <iostream>
    #include <algorithm>
    using namespace std;

    void max_heapify(int arr[], int start, int end) {
        // 建立父節(jié)點指標和子節(jié)點指標
        int dad = start;
        int son = dad * 2 + 1;
        while (son <= end) { // 若子節(jié)點指標在範圍內(nèi)才做比較
            if (son + 1 <= end && arr[son] < arr[son + 1]) // 先比較兩個子節(jié)點大小,選擇最大的
                son++;
            if (arr[dad] > arr[son]) // 如果父節(jié)點大於子節(jié)點代表調(diào)整完畢,直接跳出函數(shù)
                return;
            else { // 否則交換父子內(nèi)容再繼續(xù)子節(jié)點和孫節(jié)點比較
                swap(arr[dad], arr[son]);
                dad = son;
                son = dad * 2 + 1;
            }
        }
    }

    void heap_sort(int arr[], int len) {
        // 初始化,i從最後一個父節(jié)點開始調(diào)整
        for (int i = len / 2 1; i >= 0; i)
            max_heapify(arr, i, len 1);
        // 先將第一個元素和已經(jīng)排好的元素前一位做交換,再從新調(diào)整(剛調(diào)整的元素之前的元素),直到排序完畢
        for (int i = len 1; i > 0; i) {
            swap(arr[0], arr[i]);
            max_heapify(arr, 0, i 1);
        }
    }

    int main() {
        int arr[] = { 3, 5, 3, 0, 8, 6, 1, 5, 8, 6, 2, 4, 9, 4, 7, 0, 1, 8, 9, 7, 3, 1, 2, 5, 9, 7, 4, 0, 2, 6 };
        int len = (int) sizeof(arr) / sizeof(*arr);
        heap_sort(arr, len);
        for (int i = 0; i < len; i++)
            cout << arr[i] << ‘ ‘;
        cout << endl;
        return 0;
    }

    參考文章:

    https://github.com/hustcc/JS-Sorting-Algorithm/blob/master/7.heapSort.md

    https://zh.wikipedia.org/wiki/%E5%A0%86%E6%8E%92%E5%BA%8F

    贊(0)
    分享到: 更多 (0)
    網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號