最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c++深入淺出講解堆排序和堆

 更新時間:2022年03月29日 15:15:38   作者:YR_T  
在c++里有很多排序方法,比如相對簡單的冒泡排序、選擇排序、插入排序,還有 STL里的sort函數(shù)  手寫快排  歸并排序等,還有就是堆排序,這次主要說堆排序和堆

堆是什么

堆是一種特殊的完全二叉樹

如果你是初學(xué)者,你的表情一定是這樣的??

別想復(fù)雜

首先,你一定見過這種圖

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBZUl9U,size_12,color_FFFFFF,t_70,g_se,x_16

咱們暫時不管數(shù)字

這就是一個堆

堆又分為最大堆和最小堆

最大堆

看這張圖

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBZUl9U,size_20,color_FFFFFF,t_70,g_se,x_16

上面的節(jié)點的數(shù)都比下面的節(jié)點的數(shù)大,最上面的數(shù)是最大的,這就叫最大堆??

最小堆

還是一樣的數(shù),看這張圖

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBZUl9U,size_20,color_FFFFFF,t_70,g_se,x_16

這是一個最小堆,同最大堆,最上面的節(jié)點的數(shù)最小,上面的節(jié)點的數(shù)比下面的節(jié)點的數(shù)大

怎么樣,是不是很簡單?

堆排序

堆排序的基本思想是利用堆,使在排序中比較的次數(shù)明顯減少使速度更快

堆排序的時間復(fù)雜度為O(n*log(n)), 非穩(wěn)定排序,原地排序(空間復(fù)雜度O(1))。

堆排序的關(guān)鍵在于建堆和調(diào)整堆,下面簡單介紹一下建堆的過程:

可以用STL下的

make_heap()

具體步驟:

第1趟將索引0至n-1處的全部數(shù)據(jù)建大頂(或小頂)堆,就可以選出這組數(shù)據(jù)的最大值(或最小值)。將該堆的根節(jié)點與這組數(shù)據(jù)的最后一個節(jié)點交換,就使的這組數(shù)據(jù)中最大(最小)值排在了最后。

第2趟將索引0至n-2處的全部數(shù)據(jù)建大頂(或小頂)堆,就可以選出這組數(shù)據(jù)的最大值(或最小值)。將該堆的根節(jié)點與這組數(shù)據(jù)的倒數(shù)第二個節(jié)點交換,就使的這組數(shù)據(jù)中最大(最小)值排在了倒數(shù)第2位。

第k趟將索引0至n-k處的全部數(shù)據(jù)建最大(或最小)堆,就可以選出這組數(shù)據(jù)的最大值(或最小值)。將該堆的根節(jié)點與這組數(shù)據(jù)的倒數(shù)第k個節(jié)點交換,就使的這組數(shù)據(jù)中最大(最小)值排在了倒數(shù)第k位。

其實整個堆排序過程中, 我們只需重復(fù)做兩件事:

建堆(初始化+調(diào)整堆, 時間復(fù)雜度為O(n));

拿堆的根節(jié)點和最后一個節(jié)點交換(siftdown, 時間復(fù)雜度為O(n*log n) ).

因而堆排序整體的時間復(fù)雜度為O(n*log n)

沒看懂可以看看這個圖

最終代碼

#include <iostream>
#include <stdlib.h>
using namespace std;
 
/*******************************************/
/*  堆排序
/******************************************/
 
void swap(int &a, int &b)  //位置互換函數(shù)
{
	int temp = a;
	a = b;
	b = temp;
}
 
 
void Heap(int array[], int length, int index)  //堆排序算法(大頂堆)
{
	int left = 2 * index + 1;  //左節(jié)點數(shù)組下標
	int right = 2 * index + 2;  //右節(jié)點數(shù)組下標
	int max = index;  //index是父節(jié)點
 
	if (left < length && array[left] > array[max])  //左節(jié)點與父節(jié)點比較
	{
		max = left;
	}
	
	if (right < length && array[right] > array[max])  //右節(jié)點與父節(jié)點比較
	{
		max = right;
	}
 
	if (array[index] != array[max])
	{
		swap(array[index], array[max]);
		Heap(array, length, max);  //遞歸調(diào)用
	}
}
 
 
void HeapSort(int array[], int size)  //堆排序函數(shù)
{
	for (int i = size / 2 - 1; i >= 0; i--)  // 創(chuàng)建一個堆
	{
		Heap(array, size, i);
	}
 
	for (int i = size - 1; i >= 1; i--)
	{
		swap(array[0], array[i]);  //將array[0]的最大值放到array[i]的位置上,最大值往后靠
		Heap(array, i, 0);  //調(diào)用堆排序算法進行比較
	}
}
 
 
int main(void)  //主程序
{
	const int n = 6;  //數(shù)組元素的數(shù)量
	int array[n];
	cout << "請輸入6個整數(shù):" << endl;
	for (int i = 0; i < n; i++)
	{
		cin >> array[i];
	}
 
	cout << endl;  //換行
 
	HeapSort(array, n);  // 調(diào)用HeapSort函數(shù)  進行比較
 
	cout << "由小到大的順序排列后:" << endl;
	for (int i = 0; i < n; i++)
	{
		cout << "Array" << "[" << i << "]" << " = " << array[i] << endl;
	}
 
	cout << endl << endl;  //換行
 
	system("pause");  //調(diào)試時,黑窗口不會閃退,一直保持
	return 0;
}

關(guān)于堆

C++中堆的應(yīng)用:make_heap, pop_heap, push_heap, sort_heap

函數(shù)說明: make_heap將[start, end)范圍進行堆排序,默認使用less, 即最大元素放在第一個。

pop_heap將front(即第一個最大元素)移動到end的前部,同時將剩下的元素重新構(gòu)造成(堆排序)一個新的heap。

push_heap對剛插入的(尾部)元素做堆排序。

sort_heap將一個堆做排序,最終成為一個有序的系列,可以看到sort_heap時,必須先是一個堆(兩個特性:1、最大元素在第一個 2、添加或者刪除元素以對數(shù)時間),因此必須先做一次make_heap.

到此這篇關(guān)于c++深入淺出講解堆排序和堆的文章就介紹到這了,更多相關(guān)c++ 堆排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Qt無邊框窗口拖拽和陰影的實現(xiàn)

    Qt無邊框窗口拖拽和陰影的實現(xiàn)

    自定義窗口控件的無邊框,窗口事件由于沒有系統(tǒng)自帶邊框,無法實現(xiàn)拖拽拉伸等事件的處理,本文主要介紹了Qt無邊框窗口拖拽和陰影的實現(xiàn),感興趣的可以了解一下
    2024-01-01
  • C++Primer筆記之關(guān)聯(lián)容器的使用詳解

    C++Primer筆記之關(guān)聯(lián)容器的使用詳解

    本篇文章對C++Primer 關(guān)聯(lián)容器的使用進行了詳細的分析介紹。需要的朋友參考下
    2013-05-05
  • C++實現(xiàn)簡易UDP網(wǎng)絡(luò)聊天室

    C++實現(xiàn)簡易UDP網(wǎng)絡(luò)聊天室

    這篇文章主要為大家詳細介紹了C++實現(xiàn)簡易UDP網(wǎng)絡(luò)聊天室,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C語言實現(xiàn)逆序輸出詳細

    C語言實現(xiàn)逆序輸出詳細

    這篇文章主要介紹了C語言實現(xiàn)逆序輸出。主要實現(xiàn)C語言實現(xiàn)對數(shù)組元素依次賦值然后按照逆序輸出,下面文章小編將詳細解說,需要的朋友可以參考一下
    2021-10-10
  • C++實現(xiàn)本地TCP通訊的示例代碼

    C++實現(xiàn)本地TCP通訊的示例代碼

    這篇文章主要為大家詳細介紹了C++如何利用TCP技術(shù),實現(xiàn)本地ROS1和ROS2的通訊,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習一下
    2024-02-02
  • 統(tǒng)計C語言二叉樹中葉子結(jié)點個數(shù)

    統(tǒng)計C語言二叉樹中葉子結(jié)點個數(shù)

    這篇文章主要介紹的是統(tǒng)計C語言二叉樹中葉子結(jié)點個數(shù),文章以C語言二叉樹中葉子結(jié)點為基礎(chǔ)分享一個簡單小栗子講解,具有一定的知識參考價值,需要的小伙伴可以參考一下
    2022-02-02
  • C語言字符串左旋的兩種實現(xiàn)方法

    C語言字符串左旋的兩種實現(xiàn)方法

    匯編語言中有一種移位指令叫做循環(huán)左移(ROL),下面這篇文章主要給大家介紹了關(guān)于C語言字符串左旋的兩種實現(xiàn)方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • C++中的類成員函數(shù)當線程函數(shù)

    C++中的類成員函數(shù)當線程函數(shù)

    這篇文章主要介紹了C++中的類成員函數(shù)當線程函數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • OpenCV利用霍夫變換實現(xiàn)交通車道線檢測

    OpenCV利用霍夫變換實現(xiàn)交通車道線檢測

    經(jīng)典霍夫變換用來檢測圖像中的直線,后來霍夫變換經(jīng)過擴展可以進行任意形狀物體的識別,例如圓和橢圓。本文就來利用霍夫變換實現(xiàn)交通車道線檢測,需要的可以參考一下
    2022-09-09
  • C++連接mysql數(shù)據(jù)庫并讀取數(shù)據(jù)的具體步驟

    C++連接mysql數(shù)據(jù)庫并讀取數(shù)據(jù)的具體步驟

    在實際開發(fā)中我們經(jīng)常需要對數(shù)據(jù)庫進行訪問,針對不同類型的數(shù)據(jù)庫(如MySQL、sqLite、Access、Excel等),如果采用不同的方法進行連接,會把我們搞崩潰,下面這篇文章主要給大家介紹了關(guān)于C++連接mysql數(shù)據(jù)庫并讀取數(shù)據(jù)的具體步驟,需要的朋友可以參考下
    2023-04-04

最新評論

南陵县| 大安市| 新野县| 宜春市| 彩票| 瑞丽市| 元氏县| 巫溪县| 徐闻县| 昌黎县| 高青县| 咸阳市| 尉氏县| 双鸭山市| 安新县| 会理县| 旬邑县| 涞源县| 齐齐哈尔市| 陇南市| 白水县| 册亨县| 麻江县| 合山市| 沙河市| 内丘县| 宜兰县| 镇赉县| 天峻县| 阿瓦提县| 太康县| 福清市| 长兴县| 凌源市| 理塘县| 云和县| 波密县| 巴塘县| 叶城县| 张家港市| 虎林市|