您的位置:首页 > 编程语言 > C语言/C++

《算法导论》CLRS算法C++实现(三)P75 堆排序

2012-06-04 23:08 288 查看
第六章 堆排序

主要分为三个子算法。算法MAX-HEAPIFY(A, i)为调整堆,算法BUILD-MAX-HEAP(A)为建堆,算法HEAPSORT(A)为堆排序。运行环境Code::Blocks 10.05。

MAX-HEAPIFY(A, i)

l ← LEFT(i)
r ← RIGHT(i)
if l ≤ heap-size[A] and A[l] > A[i]
then largest ← l
else largest ← i
if r ≤ heap-size[A] and A[r] > A[largest]
then largest ← r
if largest ≠ i
then swap(A[i], A[largest])
MAX-HEAPIFY(A, largest)


BUILD-MAX-HEAP(A)

heap-size[A] ← length[A]
for i ← ⌊length[A]/2⌋ down to 1
do MAX-HEAPIFY(A, i)


HEAPSORT(A)

BUILD-MAX-HEAP(A)
for i ← length[A] downto 2
do exchange A[1] ↔ A[i]
heap-size[A] ← heap-size[A] - 1
MAX-HEAPIFY(A, 1)


C++代码实现

#include <iostream>

using namespace std;

//交换x和y

void swap(int* x, int* y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}

//返回左孩子的下标
inline int left(int i)
{
return 2 * i + 1;
}

//返回右孩子的下标
inline int right(int i)
{
return 2 * i + 2;
}

//返回父结点
inline int parent(int i)
{
if(i % 2)
return (i - 1) / 2;
return (i - 2) / 2;
}

void maxHeapify(int* arr, int i, int heapsize)
{
int l = left(i);
int r = right(i);
int largest;
if((l < heapsize) && (arr[l] > arr[i]))
largest = l;
else
largest = i;
if((r < heapsize) && (arr[r] > arr[largest]))
largest = r;
if(largest != i)
{
swap(arr[i], arr[largest]);
maxHeapify(arr, largest, heapsize);
}
}

void buildMaxHeap(int* arr, int length)
{
int i;
for(i = length / 2; i >= 0; i--)
{
maxHeapify(arr, i, length);
}
}

void heapSort(int* arr, int length)
{
int i, heapsize = length;
buildMaxHeap(arr, length);
for(i = heapsize - 1; i > 0; i--)
{
swap(arr[0], arr[i]);
heapsize--;
maxHeapify(arr, 0, heapsize);
}
}

int main()
{
int arr[] = {0, 2, 6, 98, 34, -5, 23, 11, 89, 100, 7};
heapSort(arr, 11);
for(int i = 0; i < 11; i++)
{
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: