91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++如何實現堆排序

發布時間:2021-12-22 10:25:58 來源:億速云 閱讀:177 作者:iii 欄目:開發技術

這篇文章主要介紹“C++如何實現堆排序”,在日常操作中,相信很多人在C++如何實現堆排序問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++如何實現堆排序”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

概述:

堆排序是利用構建“堆”的方法確定具有最大值的數據元素,并把該元素與最后位置上的元素交換。可將任意一個由n個數據元素構成的序列按照(a1,a2,...,an),按照從左到右的順序按層排列構成一棵與該序列對應的完全二叉樹。

一棵完全二叉樹是一個堆,當且僅當完全二叉樹的每棵子樹的根值ai≥其左子樹的根值a2i,同時ai≥其右子樹的根值a 2i+1 (1<i<n/2)。

實現堆排序需要實現兩個問題:

如何由無序序列建成一個堆?如何在輸出堆頂元素之后,調整剩余元素成為一個新的堆?

思路:

堆排序算法思想:

1、從最后一個非葉子節點逐步到樹根,對每個子樹進行調整堆。

2、重復n-1次如下處理:將堆的根與最后一個葉子交換,除最后一個葉子之外剩余部分再調整為堆。

調整堆算法思想:

1、將樹根與其左右子樹根值最大者交換;(大頂堆)

2、對交換后的左(或右)子樹重復過程1,直到左(或右)子樹為堆。

時間復雜度O(nlogn)

代碼:

調整堆算法:

void HeapAdjust(int *array,int i,int length){	//調整堆 
	int leftChild=2*i+1;		//定義左右孩子 
	int rightChild=2*i+2;
	int max=i;		//初始化,假設左右孩子的雙親節點就是最大值 
	if(leftChild<length&&array[leftChild]>array[max]){
		max=leftChild;
	}
	if(rightChild<length&&array[rightChild]>array[max]){
		max=rightChild;
	}
	if(max!=i){		//若最大值不是雙親節點,則交換值 
		swap(array[max],array[i]);
		HeapAdjust(array,max,length);	//遞歸,使其子樹也為堆 
	}
}

堆排序算法:

void HeapSort(int *array,int length){	//堆排序 
	for(int i=length/2-1;i>=0;i--){		//從最后一個非葉子節點開始向上遍歷,建立堆 
		HeapAdjust(array,i,length);
	}
	for(int j=length-1;j>0;j--){		//調整堆 ,此處不需要j=0  
		swap(array[0],array[j]);
		HeapAdjust(array,0,j);		//因為每交換一次之后,就把最大值拿出(不再參與調整堆),第三個參數應該寫j而不是length 
		Print(array,length); 
	}
}

完整代碼:

//堆排序
#include <iostream> 
using namespace std;
void Print(int array[],int length){	//每執行一次打印一次序列 
	for(int i=0;i<length;i++){
		cout<<array[i]<<" ";
	}
	cout<<endl;
}
void HeapAdjust(int *array,int i,int length){	//調整堆 
	int leftChild=2*i+1;		//定義左右孩子 
	int rightChild=2*i+2;
	int max=i;		//初始化,假設左右孩子的雙親節點就是最大值 
	if(leftChild<length&&array[leftChild]>array[max]){
		max=leftChild;
	}
	if(rightChild<length&&array[rightChild]>array[max]){
		max=rightChild;
	}
	if(max!=i){		//若最大值不是雙親節點,則交換值 
		swap(array[max],array[i]);
		HeapAdjust(array,max,length);	//遞歸,使其子樹也為堆 
	}
}
void HeapSort(int *array,int length){	//堆排序 
	for(int i=length/2-1;i>=0;i--){		//從最后一個非葉子節點開始向上遍歷,建立堆 
		HeapAdjust(array,i,length);
	}
	for(int j=length-1;j>0;j--){		//調整堆 ,此處不需要j=0  
		swap(array[0],array[j]);
		HeapAdjust(array,0,j);		//因為每交換一次之后,就把最大值拿出(不再參與調整堆),第三個參數應該寫j而不是length 
		Print(array,length); 
	}
}
int main(){
	int array[]={49,38,65,97,76,13,27,49};
	int length=sizeof(array)/sizeof(*array);
	Print(array,length);			//先打印原始序列 
	HeapSort(array,length);
	return 0;
}

運行示例:

第一行是原始序列,第二到八行分別是經過7次調整堆所得到的序列。C++如何實現堆排序

到此,關于“C++如何實現堆排序”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

岐山县| 锡林浩特市| 枝江市| 保靖县| 定远县| 陆河县| 龙陵县| 盐池县| 塔城市| 古浪县| 托克逊县| 海晏县| 灵山县| 岳池县| 许昌市| 梅河口市| 高唐县| 桃园市| 万源市| 塘沽区| 靖西县| 黄冈市| 东海县| 油尖旺区| 惠安县| 城固县| 德州市| 桑日县| 永清县| 弥渡县| 昌江| 逊克县| 咸丰县| 珠海市| 宁波市| 仙桃市| 平潭县| 浦城县| 南和县| 岚皋县| 湘乡市|