《算法导论》学习笔记之一排序算法2--堆排序的 实现代码C++

         堆排序。与归并排序一样,但不同与插入排序不同的是,堆排序的时间复杂度是O(nlog n)。而与插入排序相同,但不同于归并排序的是,堆排序同样具有空间原址性。

具体堆的实现原理,希望各位同学参考《算法导论》~个人仅是根据书中伪代码,编写C++代码不好地方。见谅

代码下载:点我

代码实现:

//heapsort.h
//堆排序
//Max_Heapify 过程:其时间复杂度为O(lg n), 它是维护最大堆性质的关键;
bool Max_Heapify(int* pArray, int i, int Heap_size)
{
	int l = i*2+1;
	int r = i*2+2;
	int largest;
	if ((l<=Heap_size-1)&&(pArray[l]>pArray[i]))
		largest = l;
	else
		largest = i;
	if ((r<=Heap_size-1)&&(pArray[r]>pArray[largest]))
		largest = r;
	if (largest != i)
	{
		int exchange = pArray[i];
		pArray[i] = pArray[largest];
		pArray[largest] = exchange;
		Max_Heapify(pArray, largest, Heap_size);
	}
	return true;
}

//Build_Max_Heap: 具有线性时间复杂度,功能是从无序的输入数据组中构建一个最大堆;
bool Build_Max_Heap(int* pArray, int Length)
{
	for (int i=(Length-1)/2; i>0; i--)
	{
		Max_Heapify(pArray, i, Length);
	}
	return true;
}

//Heap_Sort: 其时间复杂度薇O(nlgn),功能是对一个数组进行原址排序;
bool Heap_Sort(int* pArray, int Length)
{
	int Heap_size = Length;
	Build_Max_Heap(pArray, Length);
	for (int i=Length-1; i>0; i--)
	{
		int exchange = pArray[0];
		pArray[0] = pArray[i];
		pArray[i] = exchange;
		Heap_size = Heap_size-1;
		Max_Heapify(pArray, 0, Heap_size);
	}
	return true;
}
//end 堆排序
//////////////////////////////////////////////////////////////////////////
//main.cpp
//

#include "sort.h"
#include "heapsort.h"

int main()
{
	int A[14] =	{27, 17, 3, 16, 13,
				10, 1, 5, 7, 12,
				4, 8, 9, 0};
	int* p = &A[0];
	//
	//Insert_Sort_Ascending(p, 14);		//插入排序
	//Selection_Sort_Ascending(p, 14);	//选择排序
	//Bubble_Sort_Ascending(p, 0, 14);	//冒泡排序
	//Merge_Sort_Ascending(p, 0, 13);		//归并排序
	//Heap_Sort(p, 14);					//堆排序

	//
	for (int i=0; i<14; i++)
	{
		cout<<A[i]<<",";
	}

	//
	int a;
	cin>>a;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值