排序算法——堆排序 Heapsort

堆排序(Heapsort)是指利用堆进行排序的一种排序算法。堆是一种近似完全二叉树的结构,它的最大特点是对于最小堆,任何子节点的键值总是大于它的父节点;而对于最大堆,任何子节点的键值总是小于它的父节点。

堆通常可用数组表示,如果数组第一个元素的下标设为0,那么父节点i的左子节点位置为(28i+1),父节点i的右子节点位置为(2*i+2),子节点i的父节点位置为floor((i-1)/2)。

以最大堆为例,根据堆的定义,显然根节点的键值总是最大的。堆排序的算法描述如下

(1)创建最大堆:即根据一系列输入数据构建一个最大堆;

(2)调整最大堆(MaxHeapify):显然现在堆顶元素是最大的,我们取走其堆顶元素同时使堆的大小减小1,然后调整堆,使其重新变成最大堆。通常的调整方法是把堆的最后一个元素放到堆顶,顶替被取走的元素,然后自上而下的调整,使得整个堆重新变成最大堆;

(3)不断重复第二步,直到堆大小减小到0,就得到输入数据的有序序列了。

堆排序算法的时间复杂度为O(nLogn)。

C++实现

#include <iostream>
using namespace std;
 
// To heapify a subtree rooted with node i which is
// an index in arr[]. n is size of heap
void heapify(int arr[], int n, int i)
{
    int largest = i;  // Initialize largest as root
    int l = 2*i + 1;  // left = 2*i + 1
    int r = 2*i + 2;  // right = 2*i + 2
 
    // If left child is larger than root
    if (l < n && arr[l] > arr[largest])
     
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章