C++堆排序(完整版)

堆排序步骤:

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

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

#include 
#include 
using namespace std;

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

//再次调整为大顶堆
void heapify(vector &arr,int index,int heapsize)
{
	int left = index*2 + 1;
	while(left 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 &arr,int index)
{
	while(arr[index] > arr[(index-1)/2])
	{
		swap(arr,index,(index-1)/2);
		index = (index-1)/2;
	}
}

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

}

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

	heapsort(arr);

	for(int i=0;i

 

你可能感兴趣的:(算法)