C++ Heap Sort 是一种基于元素间比较的排序方法。Heapsort是一种基于二进制堆数据结构的比较的排序技术。该排序方法的工作原理是二进制堆数据结构。
二进制堆数据结构与二进制树非常相似。二进制堆是一种二进制树,其中的元素被存储在一个特定的树状结构中。其中,父节点要么大于(或小于)存储在子节点的值。根据这一点,堆被分别称为最大堆或最小堆。
我们已经在本博客中介绍了C++中的QuickSort、MergeSort和BubbleSort。
C++堆排序
堆排序类似于选择排序,我们首先找到最大的元素,并在最后放置一个最大元素。我们对剩下的项目重复同样的过程。
在这里面,也是选择值中最大的元素,然后放在值列表的最后(在升序排序的情况下)。
#什么是二进制堆
让我们首先定义完整二叉树。
完整二叉树是一棵二叉树,其中每一层(可能最后一层除外)都被填满,而且所有的节点都尽可能的靠左。
二进制堆是一个完整的二进制树,其中元素以独特的顺序存储,使得父节点的值大于(或小于)其两个子节点的值。
前者被称为最大堆,后者被称为最小堆。二叉树或数组可以表示堆。
#使用数组数据结构的原因
在这个排序方法中,我们使用数组数据结构。这主要是由于两个重要的原因:
- 阵列数据结构是相当快的,而且空间效率高。因为在数组数据结构中,元素被存储在连续的内存块中,而我们不需要存储每个元素的内存地址。因此,与其他数据结构相比,它减少了存储相同数量的项目所需的空间。
- 这里使用数组也是因为如果知道了父节点的地址,访问子节点就会变得非常容易。比方说,如果父节点存储在数组中的索引 "z",那么子节点将自动存储在2*z+1(左节点)和2*z+2(右节点)。而其他数据结构则不是这样,要找到子节点会变得非常困难。
#堆排序方法的算法
- 一旦用户输入了要排序的值,它们就被添加到一个数组数据结构中。在数值被存储后,给出的指令是将这些元素做成最大的堆。
- 这使得最大的元素被存储在堆的根部位置。在这之后,堆的大小减少了1,而堆的最后一个元素取代了根位置的值。
- 最后,堆的根部位置被堆起来。这是按以下程序进行的。
- 堆的过程是由下往上的顺序进行的,因为一个节点只有在它下面的值被堆化后才能被堆化。
- 以一个数值为例。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++中的堆排序程序就结束了。