C++实现堆排序算法一例,所建堆为大堆。
#include <iostream>
using namespace std;
int arrs[] = { 23, 65, 12, 3, 8, 76, 345, 90, 21, 75, 34, 61 };
int arrLen = sizeof(arrs) / sizeof(arrs[0]);
class heapsort
{
public:
void BuildMaxHeap(int arr[], int len); //初始建堆
void AdjustDown(int arr[], int i, int len); //调整,重新建立堆
void HeapSort(int arr[], int len); //堆排序
};
void heapsort::AdjustDown(int arr[], int i, int len)
{
int tmp = arr[i]; //暂存tmp
int j = i*2+1; //左子节点
while(j < len)
{
if(arr[j+1] > arr[j] && j < len-1) //若右子节点大
++j;
if(arr[j] > tmp) //若子节点大于父节点
{
arr[i] = arr[j];
i = j;
j = 2*i+1;
}
else
break;
}
arr[i] = tmp;
}
void heapsort::BuildMaxHeap(int arr[], int len)
{
for(int i=len/2-1; i>=0; i--) //建立堆,从最底层父节点开始
AdjustDown(arr, i, len);
}
void heapsort::HeapSort(int arr[], int len)
{
BuildMaxHeap(arr, len); //初始建堆
for(int i = len-1; i>=0; i--)
{
int maxArr = arr[0];
arr[0] = arr[i];
arr[i] = maxArr;
AdjustDown(arr, 0, i);
}
}
int main()
{
heapsort A;
A.HeapSort(arrs, arrLen);
for(int i = 0; i < arrLen; i++)
cout << arrs[i] << endl;
return 0;
}