基本的なソートアルゴリズムのヒープの並べ替え

基本的な考え方(デフォルト昇順):最大スタック使用、その子ノードのすべての特徴よりも大きいバイナリツリー、各ノードの値は、最初のノードの最大値と第1のノードの最後のノードポイント・スイッチは、そう最後のノードは、前のスタックの最大の要素の再構成に最も肯定的、その後、N-1であること、そして次に上記の手順を繰り返します。

平均時間計算量:O(NログN)。

デモ:

#include<iostream>
#include<vector>
using namespace std;
//堆排序  时间复杂度 O(n* log n)
/*
	借由二叉树的最大堆(最小堆)实现,对于升序,先将数组 排成 最大堆,降序则派成最小堆;
	然后, 每次将二叉树第一个元素与最后一个元素交换,这样最后一个元素就是最大(最小)值,
	然后重新将前面N-1个元素构建成最大堆;
	重复操作,将第一个元素与倒数第N个元素交换,在将前N-1个元素 构建成最大堆;
*/
#define RADIX 10
void my_swap(int& first, int& second)
{
	int tmp = first;
	first = second;
	second = tmp;
}
//构建堆
void BuildHeap(vector<int>&vec, int index, int last)
{
	int parent, child;
	int val = vec[index];//处理的元素
	for (parent = index; parent*2+1 <= last; parent = child)
	{
		child = parent * 2 + 1;
		//child指向左右结点中的较大者
		if (child < last && vec[child] < vec[child + 1])
			child++;

		if (val >= vec[child]) break; //找到位置
		else vec[parent] = vec[child];//继续向下
	}
	vec[parent] = val;
}

void HeapSort(vector<int>&vec)
{
	if (vec.size()<2) return;
	int last = vec.size()-1;
	//从最后一个结点的父节点开始,构建最大堆,根结点是 index=0
	for (int i = (last-1 )/2; i >= 0; i--)
	{
		BuildHeap(vec, i, last);
		/*cout << "heap:" << endl;
		for (int j=i; j <=last; j++)
			cout << vec[j] << " ";
		cout << endl;*/
	}
	
	while (last >= 0)
	{
		my_swap(vec[0], vec[last--]);
		BuildHeap(vec, 0, last);
	}
}
int main()
{
	vector<int> arr = { 12,5,9,34,3,97,63,23,53,87,120,999,1024,11,77 };
	//vector<int> arr = { 12,5,9,34 };
	cout << "raw val is:\n";
	for (auto i : arr)
		cout << i << "\t";
	cout << endl;

	HeapSort(arr);
	cout << "HeapSort val is:\n";
	for (auto i : arr)
		cout << i << "\t";
	cout << endl;
	system("pause");
	return 0;
}

 

出力:

公開された69元の記事 ウォン称賛10 ビュー30000 +

おすすめ

転載: blog.csdn.net/u010096608/article/details/103077001