亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

用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

若羌县| 萝北县| 茌平县| 沙洋县| 西平县| 庄浪县| 汨罗市| 和硕县| 仙游县| 水富县| 大名县| 北安市| 固原市| 施甸县| 南江县| 柞水县| 高碑店市| 凤台县| 于都县| 鹿邑县| 南召县| 云梦县| 高碑店市| 五峰| 汶川县| 鸡东县| 崇信县| 赫章县| 萝北县| 武陟县| 翼城县| 苍溪县| 垣曲县| 德兴市| 金沙县| 嘉善县| 庆阳市| 介休市| 哈尔滨市| 竹山县| 上林县|