中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

用C++實現堆排序

發布時間:2020-04-09 23:52:51 來源:網絡 閱讀:335 作者:張偉伊 欄目:編程語言

堆數據結構是一種數組對象,它可以被視為一顆完全二叉樹結構。

最大堆:每個父節點都大于孩子節點。

最小堆:每個父節點都小于孩子節點。

堆排序的思想:對于給定的N個數據,初始時把這些記錄看作是一顆順序存儲的二叉樹,然后將其調整為一個最大堆,然后將堆的最后一個元素與堆頂元素(即二叉樹的根節點)進行交換,堆的最后一個元素即為最大記錄;接著將(N-1)個元素(即不包括最大記錄)重新調整為一個最大堆,再將堆頂元素與堆的最后一個元素進行交換后得到次大的記錄,重復該過程直到調整的堆只剩下一個元素為止,該元素即為最小記錄,此時可得到一個有序序列。

堆排序主要包括兩個過程:一是構建堆;二是交換堆頂元素與最后一個元素的位置。

程序如下:

#include<iostream>
#include<assert.h>
using namespace std;

void AdjustDown(int *array,int size,int root)
{
	assert(array);
	int child = 2 * root + 1;
	while (child < size)
	{
		if (child + 1 < size&&array[child] < array[child + 1])
		{
			++child;
		}
		if (array[child]>array[root])
		{
			swap(array[root],array[child]);
			root = child;
			child = 2 * root + 1;
		}
		else
		{
			break;
		}
	}
}

void HeapSort(int *array, int size, int root)
{
	//找到第一個非葉子節點構建堆
	for (int i = (size - 2) / 2; i >= 0; --i)
	{
		AdjustDown(array,size,0);
	}
	for (int i = 0; i < size; ++i)
	{
		swap(array[0],array[size-1-i]);
		AdjustDown(array,size-1-i,0);
	}
}

int main()
{
	int array[10] = {12,10,16,6,8,9,11,9,7,13};
	for (int i = 0; i < 10; ++i)
	{
		cout << array[i] << " ";
	}
	cout << endl;
	HeapSort(array,10,0);
	for (int i = 0; i < 10; ++i)
	{
		cout << array[i] << " ";
	}
	cout << endl;
	return 0;
}

程序運行結果:

    用C++實現堆排序


        堆排序方法對記錄較少的文件效果一般,但對于 記錄較多的文件還是很有效的,其運行時間主要耗費在創建堆和反復調整堆上。堆排序即使在最壞的情況下,其時間復雜度也為O(N*logN)。         

向AI問一下細節

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

AI

甘孜| 江阴市| 龙川县| 车致| 南岸区| 东乌珠穆沁旗| 邳州市| 巫溪县| 枣庄市| 孟连| 虎林市| 綦江县| 运城市| 灌云县| 井冈山市| 苗栗县| 阳原县| 梨树县| 宁化县| 湖州市| 开原市| 和龙市| 滨海县| 宜兰市| 宜良县| 深圳市| 江源县| 南投县| 曲阜市| 东丰县| 韶关市| 饶阳县| 连州市| 英吉沙县| 寿阳县| 惠来县| 元朗区| 团风县| 镇巴县| 沛县| 潜江市|