如果要在n個資料中挑選出第一大和第二大的資料(要求輸出資料所在位置和值),使用什麼方法比較的次數最少?我們可以從體育錦標賽中受到啟發。
如圖【1.png】所示,8個選手的錦標賽,先兩兩捉對比拼,淘汰一半。優勝者再兩兩比拼…直到決出第一名。
第一名輸出後,只要對黃色標示的位置重新比賽即可。
下面的**實現了這個演算法(假設資料中沒有相同值)。
**中需要用乙個陣列來表示圖中的樹(注意,這是個滿二叉樹,不足需要補齊)。它不是儲存資料本身,而是儲存了資料的下標。
第乙個資料輸出後,它所在的位置被標識為-1
#include
//重新決出k號位置,v為已輸出值
voidpk(
int* a,
int* b,
int n,
int k,
int v)
if(b[k1]
==v)
pk(a,b,n,k1,v)
;else
pk(a,b,n,k2,v)
;//重新比較
if(b[k1]
<0)
if(b[k2]
<0)
if(a[b[k1]
]> a[b[k2]])
// if(______________________) //填空
b[k]
= b[k1]
;else
b[k]
= b[k2];}
//對a中資料,輸出最大,次大元素位置和值
voidf(
int* a,
int len)
//從最後乙個向前處理
for(i=
2*n-1-
1; i>
0; i-=2
)else
}//輸出樹根
printf
("%d : %d\n"
, b[0]
, a[b[0]
]);//值等於根元素的需要重新pk
pk(a,b,
2*n-1,
0,b[0]
);//再次輸出樹根
printf
("%d : %d\n"
, b[0]
, a[b[0]
]);free
(b);
}int
main()
;f(a,9);
}
藍橋杯第五屆省賽C C A組第五題 錦標賽
如果要在n個資料中挑選出第一大和第二大的資料 要求輸出資料所在位置和值 使用什麼方法比較的次數最少?我們可以從體育錦標賽中受到啟發。如圖 1.png 所示,8個選手的錦標賽,先兩兩捉對比拼,淘汰一半。優勝者再兩兩比拼 直到決出第一名。第一名輸出後,只要對黃色標示的位置重新比賽即可。下面的 實現了這個...
藍橋盃國賽之階乘位數
9的階乘等於 362880 它的二進位制表示為 1011000100110000000 這個數字共有19位。請你計算,9999 的階乘的二進位制表示一共有多少位?注意 需要提交的是乙個整數,不要填寫任何無關內容 比如說明解釋等 思路 把每乙個數都用2的x的方,然後把2的指數加起來就可以了,最後取整 ...
藍橋杯 16省賽 A9 交換瓶子 找閉環
交換瓶子 有n個瓶子,編號 1 n,放在架子上。比如有5個瓶子 2 1 3 5 4 要求每次拿起2個瓶子,交換它們的位置。經過若干次後,使得瓶子的序號為 1 2 3 4 5 對於這麼簡單的情況,顯然,至少需要交換2次就可以復位。如果瓶子更多呢?你可以通過程式設計來解決。輸入格式為兩行 第一行 乙個正...