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

溫馨提示×

溫馨提示×

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

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

100萬個數中找出最大的前K個數

發布時間:2020-08-07 22:51:12 來源:網絡 閱讀:708 作者:清幽寧 欄目:編程語言

   拿到這個題目我想到了很多方法,但是在我想到的方法中,要把在100萬個數中找到前k個數,都不適用。最后通過我的不斷研究,我想到了我認為最簡單的方法,就是利用堆來做這道題目。

   下面我分析一下我用堆排序的思路:

     1.我先建一個大小為k的堆。

     2.把100萬中前k個數放到這個堆中。

     3.把這個堆調成小堆。

     4.把100萬個從k到100萬之間的數字拿出來和堆的根結點作比較。

     5.如果根結點小于這之間的某一個數,就把這個數拿給根結點,然后繼續調成小堆。否則繼續找

     6.直到找完這100萬個數,堆中放的就是最大的前k個數。

代碼如下:

//下調
void _AdjustDown(int *arr, int parent, int size)
{
	int child = 2 * parent + 1;
	while (child<size)
	{
		//child + 1 < size保證是最后一個節點
		if (child + 1 < size&&arr[child] > arr[child + 1])
		{
			child++;//保證是孩子結點最大的一個節點
		}
		//交換
		if (arr[child] < arr[parent])
		{
			swap(arr[child], arr[parent]);
			parent = child;
			child = 2 * parent + 1;
		}
		else
		{
			break;
		}
	}
}
int* Find(int *arr, int k,int N)
{
	assert(arr);
	assert(k > 0);
	int *str = new int[k];
	//把前k個元素放在堆中
	for (int i = 0; i < k; i++)
	{
		str[i] = arr[i];
	}
	//調成最小堆
	for (int j = (k - 2) / 2; j >= 0; j--)
	{
		_AdjustDown(str, j, k);
	}
	//然后k到N的所有數與堆中的根結點相比較
	for (int n = k; n < N; n++)
	{
		if (str[0] < arr[n])//如果根結點小于堆中k到N中的某一元素
		{
			str[0] = arr[n];//把這個元素賦值給根結點
			_AdjustDown(str, 0, k);//再一次調成最小堆
		}
	}
	return str;
	delete[]str;
}

  希望這個對你們有幫助。期待你們的回復,有什么不對的地方可以指出來啊。

向AI問一下細節

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

AI

德化县| 沈丘县| 鄂托克旗| 虹口区| 衢州市| 景宁| 湖南省| 恭城| 星子县| 同心县| 台前县| 师宗县| 新余市| 双峰县| 潮州市| 黎平县| 甘德县| 大悟县| 通城县| 会昌县| 寿光市| 华亭县| 民和| 雅江县| 六枝特区| 贵州省| 横峰县| 东台市| 陵川县| 新龙县| 普陀区| 舟曲县| 永顺县| 赤峰市| 达州市| 松江区| 宁明县| 屯留县| 利津县| 紫金县| 台东市|