使用动态数组实现堆排序

C++C++Beginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习如何使用 C++ 中的动态数组实现堆排序(Heap Sort)算法。堆排序是一种基于比较的排序算法,它通过将输入分为已排序和未排序区域,并通过反复从未排序区域中提取最大或最小元素并将其移动到已排序区域来缩小未排序区域。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL cpp(("`C++`")) -.-> cpp/BasicsGroup(["`Basics`"]) cpp(("`C++`")) -.-> cpp/ControlFlowGroup(["`Control Flow`"]) cpp(("`C++`")) -.-> cpp/FunctionsGroup(["`Functions`"]) cpp(("`C++`")) -.-> cpp/AdvancedConceptsGroup(["`Advanced Concepts`"]) cpp(("`C++`")) -.-> cpp/IOandFileHandlingGroup(["`I/O and File Handling`"]) cpp/BasicsGroup -.-> cpp/operators("`Operators`") cpp/BasicsGroup -.-> cpp/arrays("`Arrays`") cpp/ControlFlowGroup -.-> cpp/for_loop("`For Loop`") cpp/FunctionsGroup -.-> cpp/function_parameters("`Function Parameters`") cpp/FunctionsGroup -.-> cpp/recursion("`Recursion`") cpp/AdvancedConceptsGroup -.-> cpp/pointers("`Pointers`") cpp/IOandFileHandlingGroup -.-> cpp/user_input("`User Input`") subgraph Lab Skills cpp/operators -.-> lab-96200{{"`使用动态数组实现堆排序`"}} cpp/arrays -.-> lab-96200{{"`使用动态数组实现堆排序`"}} cpp/for_loop -.-> lab-96200{{"`使用动态数组实现堆排序`"}} cpp/function_parameters -.-> lab-96200{{"`使用动态数组实现堆排序`"}} cpp/recursion -.-> lab-96200{{"`使用动态数组实现堆排序`"}} cpp/pointers -.-> lab-96200{{"`使用动态数组实现堆排序`"}} cpp/user_input -.-> lab-96200{{"`使用动态数组实现堆排序`"}} end

创建动态数组

我们将在 ~/project 目录下使用以下命令创建一个名为 main.cpp 的新文件:

touch ~/project/main.cpp

首先,我们将创建一个动态数组来存储元素。我们将使用 new 操作符在程序运行时动态分配内存。

int* arr;
arr = new int[size];

Heapify 函数

接下来,我们将创建 heapify() 函数来重新排列数组中的元素。heapify() 函数的目的是维护堆属性,即每个节点都大于或等于其子节点。

void heapify(int* arr, int n, int i) {
    int largest = i;
    int left = 2 * i + 1;
    int right = 2 * i + 2;

    if (left < n && arr[left] > arr[largest])
        largest = left;

    if (right < n && arr[right] > arr[largest])
        largest = right;

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

Heap Sort 函数

在实现 heapify() 函数之后,我们将创建 heapSort() 函数以升序排列数组。

void heapSort(int* arr, int n) {
    for (int i = n / 2 - 1; i >= 0; i--)
        heapify(arr, n, i);

    for (int i = n - 1; i >= 0; i--) {
        swap(arr[0], arr[i]);
        heapify(arr, i, 0);
    }
}

Main 函数

最后,我们将创建 main() 函数,用于从用户读取元素并使用堆排序算法显示排序后的数组。

int main() {
    int size;
    cout << "Enter the number of elements: ";
    cin >> size;

    int* arr;
    arr = new int[size];

    cout << "Enter the elements: ";
    for (int i = 0; i < size; i++) {
        cin >> arr[i];
    }

    heapSort(arr, size);

    cout << "Sorted Array: ";
    for (int i = 0; i < size; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;

    delete[] arr;
    return 0;
}

总结

在本实验中,你学习了如何使用 C++ 中的动态数组实现堆排序算法。你还学习了如何创建动态数组、对数组进行堆化(heapify)以及排序数组以升序显示排序后的数组。按照说明运行示例代码,并练习实现堆排序算法。

您可能感兴趣的其他 C++ 教程