推免複習之數據結構與算法 堆排序

堆排序我也不準備細寫,主要的原因是感覺我寫的可能沒有別的博客那麼清晰,我沒有必要重複造輪子,所以下面就放我看了之後覺得講解的非常清晰的一篇博文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;
}

 

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