C++堆排序(完整版)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wx1458451310/article/details/88033216

堆排序步骤:

(1)变为大顶堆;根节点的值大于等于其孩子节点的值。堆是一个完全二叉树,很适合用顺序结构来实现,这里我们选择数组。

(2)最后一个数据和最顶部节点数据交换(最大值放在最后),然后再进行一次调整(heapify函数),变为大顶堆(此时heapsize减1)。

#include <iostream>
#include <vector>
using namespace std;

//交换两个数
void swap(vector<int> &arr,int i,int j)
{
	int temp = arr[i];
	arr[i] = arr[j];
	arr[j] = temp;
}

//再次调整为大顶堆
void heapify(vector<int> &arr,int index,int heapsize)
{
	int left = index*2 + 1;
	while(left<heapsize)
	{
		int largest = left+1<heapsize && arr[left+1] > arr[left] ? left+1 : left;
		largest = arr[largest] > arr[index] ? largest : index;
		if (index == largest)
			break;
		swap(arr,index,largest);
		index = largest;
		left = index*2 + 1;
	}
}


//变为大顶堆
void heapinsert(vector<int> &arr,int index)
{
	while(arr[index] > arr[(index-1)/2])
	{
		swap(arr,index,(index-1)/2);
		index = (index-1)/2;
	}
}

//排序
void heapsort(vector<int> &arr)
{
	if (arr.size()<2)
		return;
	for (int i=0;i<arr.size();i++)
		heapinsert(arr,i);
	
	int heapsize = arr.size();
	swap(arr,0,--heapsize);
	while(heapsize>0)
	{
		heapify(arr,0,heapsize);
		swap(arr,0,--heapsize);
	}

}

int main()
{
	vector<int> arr;
	int n,temp;
	cin>>n;
	for (int i=0;i<n;i++)
	{
		cin>>temp;
		arr.push_back(temp);
	}

	heapsort(arr);

	for(int i=0;i<arr.size();i++)
		cout<<arr[i]<<endl;
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/wx1458451310/article/details/88033216