码迷,mamicode.com
首页 > 编程语言 > 详细

堆排序--采用快速排序(利用大堆实现升序,小堆实现降序)

时间:2016-05-03 00:40:42      阅读:462      评论:0      收藏:0      [点我收藏+]

标签:堆排序 选择排序 升序 降序

    对堆进行排序,利用大堆实现升序,小堆实现降序。例如升序的实现,将较大数据存放在最后面,依次往前存放数据。具体为交换第一个元素和最后一个元素,再将不包含最后一个元素的堆进行下调,使堆保持大堆,将最大数据存放在堆中第一个位置,循环执行上述步骤,直到需要下调的数据个数为0.

void AdjustDown(int *a, size_t root, size_t size)//下调--k为数组下标,size为数组元素个数
{//大堆
	size_t parent = root;
	size_t child = parent * 2 + 1;
	while (child < size)
	{
		if (child + 1 < size && a[child] < a[child + 1])
		{
			++child;
		}
		if (a[parent] < a[child])
		{
			swap(a[parent], a[child]);
			parent = child;
			child = parent * 2 + 1;
		}
		else//注意不满足交换条件时跳出本次循环
		{
			break;
		}
	}
}
void HeapSort(int *a, size_t size)//堆排序--采用快速排序(利用大堆实现升序,小堆实现降序)
{
	assert(a);
	for (int i = ((int)size-2)/2; i >= 0; --i)//建堆
	{
		AdjustDown(a, i, size);//下调i为堆顶的堆
	}
	for (size_t i = 0; i < size; ++i)
	{//由于该堆为大堆,则把第一个元素和最后一个元素进行交换,再进行下调
		swap(a[0], a[size - 1 - i]);//交换堆顶数据和最后一位的数据,使最后一个元素存放最大(小)数
		//size-1-i为进行下调的元素个数,每交换一次减1,使最后一个元素不参与下调,下调使堆顶存放size-1-i个数中最大(小)数
		AdjustDown(a, 0, size - 1 - i);
	}
}

测试用例如下:

void Test()
{//堆排序
	int arr[] = { 10, 16, 18, 12, 11, 13, 15, 17, 14, 19 };
	size_t size = sizeof(arr) / sizeof(arr[0]);
	HeapSort(arr, size);
	for (size_t i = 0; i < size; ++i)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
}

本文出自 “Scen” 博客,请务必保留此出处http://10741357.blog.51cto.com/10731357/1769544

堆排序--采用快速排序(利用大堆实现升序,小堆实现降序)

标签:堆排序 选择排序 升序 降序

原文地址:http://10741357.blog.51cto.com/10731357/1769544

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!