日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

c++實現堆排序的示例代碼_C 語言

作者:吳天德少俠 ? 更新時間: 2023-04-01 編程語言

看了一下優先隊列,查了一下堆排序。堆排序主要就是建最大堆(最小堆)和交換2個操作。如果建的是最大堆,那么交換的時候,父節點就和最大的子節點比較,如果它比最大的子節點還大,那就不用比了。因為后面還有一個交換的操作,所以最后得到的就是由小到大的排序;反之,得到的就是由大到小的排序。

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

void maxHeapify(int arr[], int start, int end)
{
	int dad = start;
	int son = dad * 2 + 1;
	while (son <= end) {
		if (son + 1 <= end && arr[son] < arr[son + 1]) {
			son++;// 找出最大的兒子
		}
		// 父節點跟最大的子節點比較即可
		if (arr[dad] > arr[son]) {
			return;
		}
		else {
			// 交換父節點與子節點
			swap<int>(arr[dad], arr[son]);
			// 這個時候父節點位置滿足要求了,下面的子節點不一定滿足要求
			// 還需要檢查有沒有導致下面的子節點受到影響
			dad = son;
			son = dad * 2 + 1;
		}
	}
}

void heapSort(int arr[], int len)
{
	// 初始化,從最后一個父節點開始,調整所有的父節點
	for (int i = len / 2 - 1; i >= 0; i--) {
		maxHeapify(arr, i, len - 1);
	}
	// 這個時候找到了最大元素(堆頂),
	// 將其和最后一個元素交換。(這樣就會得到由小到大的排序)	
	for (int i = len - 1; i > 0; i--) {
		swap(arr[0], arr[i]);
		// 將交換之后除了最后一個元素的所有元素,重新調整為最大堆
		maxHeapify(arr, 0, i - 1);
	}
}

int main()
{
	int arr[]{ 5,3,4,9,7,8,1,2,10,23,15 };
	int len = int(sizeof(arr) / sizeof(*arr));
	heapSort(arr, len);
	cout << "排序之后:" << endl;
	for (auto item : arr) {
		cout << item << " ";
	}

	return 0;
}

在這里插入圖片描述

這幾行代碼干的事情,就是如下圖所示,由低向高,逐漸生成最大堆,找到最大元素

在這里插入圖片描述

緊接著的后面的for循環就是最后一個元素和堆頂元素交換,然后重新調整除了交換到后面來的元素,直到只有堆頂一個元素。就排好序了。

在這里插入圖片描述

原文鏈接:https://blog.csdn.net/sdhdsf132452/article/details/128779508

欄目分類
最近更新