C++实现堆排序算法

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;
}


猜你喜欢

转载自blog.csdn.net/hhhlizhao/article/details/76735639