C++ Heap Sort排序方法完整指南

200 阅读4分钟

C++ Heap Sort 是一种基于元素间比较的排序方法。Heapsort是一种基于二进制堆数据结构的比较的排序技术。该排序方法的工作原理是二进制堆数据结构。

二进制堆数据结构与二进制树非常相似。二进制堆是一种二进制树,其中的元素被存储在一个特定的树状结构中。其中,父节点要么大于(或小于)存储在子节点的值。根据这一点,堆被分别称为最大堆或最小堆。

我们已经在本博客中介绍了C++中的QuickSortMergeSortBubbleSort

C++堆排序

堆排序类似于选择排序,我们首先找到最大的元素,并在最后放置一个最大元素。我们对剩下的项目重复同样的过程。

在这里面,也是选择值中最大的元素,然后放在值列表的最后(在升序排序的情况下)。

#什么是二进制堆

让我们首先定义完整二叉树。

完整二叉树是一棵二叉树,其中每一层(可能最后一层除外)都被填满,而且所有的节点都尽可能的靠左。

二进制堆是一个完整的二进制树,其中元素以独特的顺序存储,使得父节点的值大于(或小于)其两个子节点的值。

前者被称为最大堆,后者被称为最小堆。二叉树或数组可以表示堆。

#使用数组数据结构的原因

在这个排序方法中,我们使用数组数据结构。这主要是由于两个重要的原因:

  1. 阵列数据结构是相当快的,而且空间效率高。因为在数组数据结构中,元素被存储在连续的内存块中,而我们不需要存储每个元素的内存地址。因此,与其他数据结构相比,它减少了存储相同数量的项目所需的空间。
  2. 这里使用数组也是因为如果知道了父节点的地址,访问子节点就会变得非常容易。比方说,如果父节点存储在数组中的索引 "z",那么子节点将自动存储在2*z+1(左节点)和2*z+2(右节点)。而其他数据结构则不是这样,要找到子节点会变得非常困难。

#堆排序方法的算法

  1. 一旦用户输入了要排序的值,它们就被添加到一个数组数据结构中。在数值被存储后,给出的指令是将这些元素做成最大的堆。
  2. 这使得最大的元素被存储在堆的根部位置。在这之后,堆的大小减少了1,而堆的最后一个元素取代了根位置的值。
  3. 最后,堆的根部位置被堆起来。这是按以下程序进行的。
  4. 堆的过程是由下往上的顺序进行的,因为一个节点只有在它下面的值被堆化后才能被堆化。
  5. 以一个数值为例。12, 20, 6, 15, 2

12(0)

/ \

20(1) 6(2)

/ \

15(3) 2(4)

从索引1开始的程序。

12(0)

/ \

20(1) 6(2)

/ \

15(3) 2(4)

那么我们就以指数0继续

20(0)

/ \

15(1) 6(2)

/ \

12(3) 2(4)

上述步骤一次又一次地递归继续,直到堆的值大于1。

#C++堆排序程序

请看下面的程序:

#include <iostream>
using namespace std;

void convertHeap(int array[], int len, int x)
{
    int largest = x;
    int left = 2 * x + 1;
    int right = 2 * x + 2;

    if (left < len && array[left] > array[largest])
        largest = left;

    if (right < len && array[right] > array[largest])
        largest = right;

    if (largest != x)
    {
        swap(array[x], array[largest]);

        convertHeap(array, len, largest);
    }
}

void heapSort(int array[], int len)
{
    for (int i = len / 2 - 1; i >= 0; i--)
        convertHeap(array, len, i);

    for (int i = len - 1; i >= 0; i--)
    {
        swap(array[0], array[i]);
        convertHeap(array, i, 0);
    }
}

void display(int array[], int len)
{
    cout << "After sorting, the array is: \n";
    for (int i = 0; i < len; ++i)
        cout << array[i] << " ";
    cout << endl;
}

int main()
{
    int array[] = {12, 20, 6, 15, 2};
    int len = sizeof(array) / sizeof(array[0]);

    heapSort(array, len);
    display(array, len);
}

最后,C++堆排序实例|C++中的堆排序程序就结束了。