排序算法---堆排序

参考网址:http://www.cnblogs.com/eniac12/p/5329396.html#s6
算法描述:
堆排序是指利用堆这种数据结构所设计的一种选择排序算法。堆是一种近似完全二叉树的结构(通常堆是通过一维数组来实现的),并满足性质:以最大堆(也叫大根堆、大顶堆)为例,其中父结点的值总是大于它的孩子节点。
我们可以很容易的定义堆排序的过程:

  1. 由输入的无序数组构造一个最大堆,作为初始的无序区
  2. 把堆顶元素(最大值)和堆尾元素互换
  3. 把堆(无序区)的尺寸缩小1,并调用heapify(A, 0)从新的堆顶元素开始进行堆调整
  4. 重复步骤2,直到堆的尺寸为1

代码如下:

#include<iostream>
using namespace std;
// 分类 -------------- 内部比较排序
// 数据结构 ---------- 数组
// 最差时间复杂度 ---- O(nlogn)
// 最优时间复杂度 ---- O(nlogn)
// 平均时间复杂度 ---- O(nlogn)
// 所需辅助空间 ------ O(1)
// 稳定性 ------------ 不稳定
void Swap(int arr[], int i, int j)
{
	int temp = arr[i];
	arr[i] = arr[j];
	arr[j] = temp;
}

void Heapiy(int arr[], int i, int size)    // 从A[i]向下进行堆调整
{
        int left_child = 2 * i + 1;         // 左孩子索引
        int right_child = 2 * i + 2;        // 右孩子索引
        int max = i;                        // 选出当前结点与其左右孩子三者之中的最大值
	if (left_child < size && arr[left_child] > arr[max])
		max = left_child;
	if (right_child < size && arr[right_child] > arr[max])
		max = right_child;
	if (max != i)
	{
		Swap(arr, i, max);
		Heapiy(arr, max, size);
	}
}

int BuildHeap(int arr[], int n)
{
	int heap_size = n;
	for (int i = heap_size / 2 - 1; i >= 0; i--)
	{
		Heapiy(arr, i, heap_size);
	}
	return heap_size;
}

void HeapSort(int arr[], int n)
{
	int heap_size = BuildHeap(arr, n);
	while (heap_size > 1)
	{
		Swap(arr, 0, --heap_size);
		Heapiy(arr, 0, heap_size);
	}
}

int main()
{
	int arr[] = { 5, 4, 7, 3, 9, 2, 4, 1, 9, 0, 6, 8 };
	int len = sizeof(arr) / sizeof(int);
	HeapSort(arr, len);
	for (int i = 0; i < len; i++)
	{
		cout << arr[i] << endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值