推免复习之数据结构与算法 堆排序

堆排序我也不准备细写,主要的原因是感觉我写的可能没有别的博客那么清晰,我没有必要重复造轮子,所以下面就放我看了之后觉得讲解的非常清晰的一篇博文https://www.cnblogs.com/chengxiao/p/6129630.html

大体思路看完了,建堆和排序也会了,剩下的还有插入节点和删除节点操作,看这篇博客即可https://www.jianshu.com/p/21bef3fc3030

大小顶堆的算法大部分都是一样的,就是在判断大小那里判断条件相反,我给的代码是构建大顶堆,最后排序的结果是升序。

代码如下:

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

void swap(vector<int> &arr,int a,int b)
{
	int temp = arr[a];
	arr[a] = arr[b];
	arr[b] = temp;
}

void adjustHeap(vector<int> &arr,int i,int size)
{
	int temp = arr[i];
	for (int k = 2 * i + 1; k < size; k = 2 * k + 1)  //每次都是指向左节点
	{
		if (k + 1 < size && arr[k] < arr[k + 1])  //如果右节点比左节点大,则指向右节点
		{
			k++;
		}
		if (arr[k] > temp)  //如果子节点比父节点大,则节点一直下滑
		{
			arr[i] = arr[k];
			i = k;
		}
		else  //否则停止下滑
		{
			break;
		}
		arr[i] = temp;
	}
}

void sort(vector<int> &arr)
{
	int size = arr.size();
	for (int i = size / 2 - 1; i >= 0; i--)
	{
		adjustHeap(arr,i,size);
	}
	for (int i = size - 1; i >= 0; i--)  //挨个取根节点元素按顺序放到数组的后面
	{
		swap(arr,0,i);
		adjustHeap(arr,0,i);
	}
}



int main()
{
	vector<int> Input = {1,9,6,3,7,8,2,5,4,76,12,41,31,67,19,20,91,74};
	sort(Input);
	int size = Input.size();
	for (int i = 0; i < size; i++)
	{
		cout << Input[i] << "  ";
	}
	system("pause");
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章