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

溫馨提示×

溫馨提示×

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

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

用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

长海县| 清原| 保德县| 五指山市| 独山县| 丹棱县| 乐都县| 洮南市| 新津县| 南宁市| 仙桃市| 云和县| 赤壁市| 自贡市| 黄石市| 句容市| 龙门县| 江门市| 读书| 海兴县| 湟中县| 阳信县| 清丰县| 新源县| 和龙市| 南通市| 贵定县| 简阳市| 越西县| 乐业县| 红河县| 南丹县| 舞阳县| 郸城县| 武宁县| 承德县| 辛集市| 海城市| 前郭尔| 儋州市| 广丰县|