如何使用C++實現堆排序演算法

一、什麼是堆排序演算法

堆排序演算法是一種基於完全二叉樹的排序演算法,它指定了一個最大/最小堆的概念,通過不斷將根節點移動到數組的末尾,並對餘下的元素重建堆,最後達到排序的目的。堆排序演算法的時間複雜度為O(nlogn)。

二、堆排序演算法的實現步驟

1. 構建初始堆:將n個元素構建成初始堆,從最後一個非葉子結點開始,自下而上執行堆調整(maxHeap)。

2. 將堆頂元素放到末尾:交換堆頂元素和序列末尾元素,堆大小減1。

3. 重建堆:對新的堆頂元素進行heapify操作(maxHeap),將其放到正確的位置。

4. 重複上述步驟,直到堆大小為1。

三、C++實現堆排序演算法

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

// 構建初始堆
void maxHeapify(vector<int>& nums, int heapSize, int index) {
    int left = 2 * index + 1;
    int right = 2 * index + 2;
    int largest = index;
    if (left < heapSize && nums[left] > nums[largest]) {
        largest = left;
    }
    if (right < heapSize && nums[right] > nums[largest]) {
        largest = right;
    }
    if (largest != index) {
        swap(nums[index], nums[largest]);
        maxHeapify(nums, heapSize, largest);
    }
}

// 堆排序
void heapSort(vector<int>& nums) {
    int n = nums.size();
    // 構建初始堆
    for (int i = n / 2 - 1; i >= 0; i--) {
        maxHeapify(nums, n, i);
    }
    // 將堆頂元素放到末尾,重建堆
    for (int i = n - 1; i > 0; i--) {
        swap(nums[0], nums[i]);
        maxHeapify(nums, i, 0);
    }
}

int main() {
    vector<int> nums = {4, 1, 3, 2, 5, 6};
    heapSort(nums);
    for (int num : nums) {
        cout << num << " ";
    }
    return 0;
}

四、堆排序演算法的優化

堆排序演算法可以有許多優化,比如使用最小堆代替最大堆,使用堆內存儲的元素下標代替額外空間存儲堆元素,使用堆化的方式構建初始堆等等。

其中,使用堆化的方式構建初始堆可以減少時間複雜度,堆化方式有自上而下的堆化和自下而上的堆化。自上而下的堆化相比自下而上的堆化來說,需要更多的swap操作,但在堆偏小的情況下會比較適用。

// 自上而下的堆化
void maxHeapify(vector<int>& nums, int heapSize, int index) {
    int left = 2 * index + 1;
    int right = 2 * index + 2;
    int largest = index;
    while (left < heapSize) {
        if (nums[left] > nums[largest]) {
            largest = left;
        }
        if (right < heapSize && nums[right] > nums[largest]) {
            largest = right;
        }
        if (largest != index) {
            swap(nums[index], nums[largest]);
            index = largest;
            left = 2 * index + 1;
            right = 2 * index + 2;
            largest = index;
        } else {
            break;
        }
    }
}

五、總結

堆排序演算法是一種快速穩定的排序演算法,通過構建最大/最小堆的方式對無序序列進行排序。C++實現堆排序只需要實現maxHeapify和heapSort兩個函數,便可以對序列進行排序。在實際應用中,還可以通過堆化方式構建初始堆,進一步提高堆排序的效率。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/239104.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:14
下一篇 2024-12-12 12:14

相關推薦

  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Python實現爬樓梯演算法

    本文介紹使用Python實現爬樓梯演算法,該演算法用於計算一個人爬n級樓梯有多少種不同的方法。 有一樓梯,小明可以一次走一步、兩步或三步。請問小明爬上第 n 級樓梯有多少種不同的爬樓梯…

    編程 2025-04-29
  • 如何使用Python獲取某一行

    您可能經常會遇到需要處理文本文件數據的情況,在這種情況下,我們需要從文本文件中獲取特定一行的數據並對其進行處理。Python提供了許多方法來讀取和處理文本文件中的數據,而在本文中,…

    編程 2025-04-29
  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29
  • 如何使用jumpserver調用遠程桌面

    本文將介紹如何使用jumpserver實現遠程桌面功能 一、安裝jumpserver 首先我們需要安裝並配置jumpserver。 $ wget -O /etc/yum.repos…

    編程 2025-04-29
  • Harris角點檢測演算法原理與實現

    本文將從多個方面對Harris角點檢測演算法進行詳細的闡述,包括演算法原理、實現步驟、代碼實現等。 一、Harris角點檢測演算法原理 Harris角點檢測演算法是一種經典的計算機視覺演算法…

    編程 2025-04-29
  • 數據結構與演算法基礎青島大學PPT解析

    本文將從多個方面對數據結構與演算法基礎青島大學PPT進行詳細的闡述,包括數據類型、集合類型、排序演算法、字元串匹配和動態規劃等內容。通過對這些內容的解析,讀者可以更好地了解數據結構與算…

    編程 2025-04-29
  • 如何使用Python讀取CSV數據

    在數據分析、數據挖掘和機器學習等領域,CSV文件是一種非常常見的文件格式。Python作為一種廣泛使用的編程語言,也提供了方便易用的CSV讀取庫。本文將介紹如何使用Python讀取…

    編程 2025-04-29
  • Hibernate註解聯合主鍵 如何使用

    解答:Hibernate的註解方式可以用來定義聯合主鍵,使用@Embeddable和@EmbeddedId註解。 一、@Embeddable和@EmbeddedId註解 在Hibe…

    編程 2025-04-29
  • 瘦臉演算法 Python 原理與實現

    本文將從多個方面詳細闡述瘦臉演算法 Python 實現的原理和方法,包括該演算法的意義、流程、代碼實現、優化等內容。 一、演算法意義 隨著科技的發展,瘦臉演算法已經成為了人們修圖中不可缺少…

    編程 2025-04-29

發表回復

登錄後才能評論