亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

c++實(shí)現(xiàn)堆排序的示例代碼

 更新時(shí)間:2023年02月02日 09:05:49   作者:吳天德少俠  
本文主要介紹了c++實(shí)現(xiàn)堆排序的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

看了一下優(yōu)先隊(duì)列,查了一下堆排序。堆排序主要就是建最大堆(最小堆)和交換2個(gè)操作。如果建的是最大堆,那么交換的時(shí)候,父節(jié)點(diǎn)就和最大的子節(jié)點(diǎn)比較,如果它比最大的子節(jié)點(diǎn)還大,那就不用比了。因?yàn)楹竺孢€有一個(gè)交換的操作,所以最后得到的就是由小到大的排序;反之,得到的就是由大到小的排序。

#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++;// 找出最大的兒子
		}
		// 父節(jié)點(diǎn)跟最大的子節(jié)點(diǎn)比較即可
		if (arr[dad] > arr[son]) {
			return;
		}
		else {
			// 交換父節(jié)點(diǎn)與子節(jié)點(diǎn)
			swap<int>(arr[dad], arr[son]);
			// 這個(gè)時(shí)候父節(jié)點(diǎn)位置滿(mǎn)足要求了,下面的子節(jié)點(diǎn)不一定滿(mǎn)足要求
			// 還需要檢查有沒(méi)有導(dǎo)致下面的子節(jié)點(diǎn)受到影響
			dad = son;
			son = dad * 2 + 1;
		}
	}
}

void heapSort(int arr[], int len)
{
	// 初始化,從最后一個(gè)父節(jié)點(diǎn)開(kāi)始,調(diào)整所有的父節(jié)點(diǎn)
	for (int i = len / 2 - 1; i >= 0; i--) {
		maxHeapify(arr, i, len - 1);
	}
	// 這個(gè)時(shí)候找到了最大元素(堆頂),
	// 將其和最后一個(gè)元素交換。(這樣就會(huì)得到由小到大的排序)	
	for (int i = len - 1; i > 0; i--) {
		swap(arr[0], arr[i]);
		// 將交換之后除了最后一個(gè)元素的所有元素,重新調(diào)整為最大堆
		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循環(huán)就是最后一個(gè)元素和堆頂元素交換,然后重新調(diào)整除了交換到后面來(lái)的元素,直到只有堆頂一個(gè)元素。就排好序了。

在這里插入圖片描述

到此這篇關(guān)于c++實(shí)現(xiàn)堆排序的示例代碼的文章就介紹到這了,更多相關(guān)c++ 堆排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中復(fù)制構(gòu)造函數(shù)和重載賦值操作符總結(jié)

    C++中復(fù)制構(gòu)造函數(shù)和重載賦值操作符總結(jié)

    這篇文章主要介紹了C++中復(fù)制構(gòu)造函數(shù)和重載賦值操作符總結(jié),本文對(duì)復(fù)制構(gòu)造函數(shù)和重載賦值操作符的定義、調(diào)用時(shí)機(jī)、實(shí)現(xiàn)要點(diǎn)、細(xì)節(jié)等做了總結(jié),需要的朋友可以參考下
    2014-10-10
  • 詳解C語(yǔ)言中fseek函數(shù)和ftell函數(shù)的使用方法

    詳解C語(yǔ)言中fseek函數(shù)和ftell函數(shù)的使用方法

    這篇文章主要介紹了C語(yǔ)言中fseek函數(shù)和ftell函數(shù)的使用方法,兩個(gè)函數(shù)分別用于設(shè)置和返回文件指針stream的位置,需要的朋友可以參考下
    2016-03-03
  • 利用QT設(shè)計(jì)秒表功能

    利用QT設(shè)計(jì)秒表功能

    這篇文章主要為大家詳細(xì)介紹了利用QT設(shè)計(jì)秒表功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 深入理解C語(yǔ)言的邏輯控制

    深入理解C語(yǔ)言的邏輯控制

    這篇文章主要介紹了C語(yǔ)言的邏輯控制,對(duì)C語(yǔ)言的邏輯控制有較為深入的剖析,需要的朋友可以參考下
    2014-07-07
  • 關(guān)于Qt添加opencv和libtorch庫(kù)的問(wèn)題

    關(guān)于Qt添加opencv和libtorch庫(kù)的問(wèn)題

    這篇文章主要介紹了Qt添加opencv和libtorch庫(kù)的相關(guān)知識(shí),兩種方法一種是通過(guò)手動(dòng)添加,一種是通過(guò)qt creator添加,需要的朋友可以參考下
    2022-01-01
  • C++連連看判定圖形消除算法

    C++連連看判定圖形消除算法

    這篇文章主要為大家詳細(xì)介紹了C++連連看判定圖形消除算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • cocos2dx實(shí)現(xiàn)橡皮擦效果以及判斷是否擦除完畢

    cocos2dx實(shí)現(xiàn)橡皮擦效果以及判斷是否擦除完畢

    這篇文章主要為大家詳細(xì)介紹了cocos2dx實(shí)現(xiàn)橡皮擦效果以及判斷是否擦除完畢,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • C++輸入輸出操作符重載的深入分析

    C++輸入輸出操作符重載的深入分析

    本篇文章是對(duì)C++輸入輸出操作符重載進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 淺析c++ 中const關(guān)鍵字

    淺析c++ 中const關(guān)鍵字

    const是一個(gè)C++語(yǔ)言的限定符,它限定一個(gè)變量不允許被改變。使用const在一定程度上可以提高程序的安全性和可靠性。下面通過(guò)本文給大家分享c++ const關(guān)鍵字的相關(guān)知識(shí),一起看看吧
    2017-06-06
  • OpenCV實(shí)現(xiàn)車(chē)牌定位(C++)

    OpenCV實(shí)現(xiàn)車(chē)牌定位(C++)

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)車(chē)牌定位,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11

最新評(píng)論