91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

【數據結構】將一組數據升序排序(利用堆排序)

發布時間:2020-08-10 20:40:59 來源:網絡 閱讀:810 作者:韓靜靜 欄目:編程語言

堆排序相對冒泡排序、選擇排序效率很高,不再是O(n^2).


假若將一個序列升序排序好,那么我們來考慮最大堆還是最小堆來排序。假若是最小堆的話,堆的頂端必定是堆中的最小值,這樣貌似可以。但是,如果是它的(一邊或)子樹左子樹的節點數據值大于(一邊或)右子樹的節點數據值,直接打印肯定是錯誤的,而且對于此時的堆我們也無法操控來調整好正確的順序了。


那我們換成最大堆來實現升序想,當我們把序列調整成為最大堆后,最大堆頂端的數據值是最大的,然后我們將這個最大值與堆的最后一個葉子節點值來進行交換,再將交換后的頂端值進行調整,換到合適的位置處……重復這樣的工作,注意:進行第2次交換就要將頂端元素值與倒數第2個節點元素值交換了,且調整頂端元素位置也不能一直調整到size-1處。(因為:size-1處的值已經是最大)


代碼如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

#include<assert.h>


void AdjustDown(int* a,int parent, int size)
{
    int child = 2 * parent + 1;
    while (child < size)
    {
        if (child + 1 < size && a[child] < a[child + 1])
        {
            ++child;
        }
        if (a[child]>a[parent])
        {
            swap(a[child], a[parent]);
            parent = child;
            child = 2 * parent + 1;
        }
        else
        {
            break;
        }
    }
}


void Print(int*a, int size)
{
    cout << "升序序列為:"<<endl;
    for (int i = 0; i < size; i++)
    {
        cout << a[i] << "  ";
    }
    cout << endl;
}


void HeapSort(int* a,int size)
{
    assert(a);
    
    //建成最大堆
    for (int i = (size - 2) / 2; i >=0; i--)
    {
        AdjustDown(a,i, size);
    }

    //交換順序
    for (int i = 0; i < size; i++)
    {
        swap(a[0], a[size - i - 1]);
        AdjustDown(a, 0, size-i-1);
    }    
}

 
void Test()
{
    int arr[] = { 12, 2, 10, 4, 6, 8, 54, 67,100,34,678, 25, 178 };
    int size = sizeof(arr) / sizeof(arr[0]);
    HeapSort(arr, size);    
    Print(arr,size);
}


int main()
{
    Test();
    system("pause");
    return 0;
}


時間復雜度:

(n-2)/2*lgn+n*(1+lgn)--->O(n).


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

临沂市| 自贡市| 营山县| 察哈| 家居| 德令哈市| 大兴区| 芮城县| 桐梓县| 宁都县| 静乐县| 方城县| 怀来县| 凤山县| 大宁县| 靖江市| 年辖:市辖区| 梧州市| 南木林县| 托克托县| 横峰县| 潼关县| 中方县| 桑日县| 宽城| 弥渡县| 刚察县| 桂平市| 芒康县| 淮阳县| 嘉祥县| 穆棱市| 建德市| 赤城县| 阳朔县| 星子县| 时尚| 当阳市| 克拉玛依市| 伊宁市| 大余县|