生活随笔
收集整理的這篇文章主要介紹了
找出第二小元素(算法导论第三版9.1-1题)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
找出第二小元素(算法導論第三版9.1-1題)
時間復雜度Θ(n)
比較次數n+?lgn??2次
思路:將元素每次分成2部分,第一部分和第二部分元素成對比較。最終獲得最小的元素,記錄那些和最小元素比較后的失敗的元素,第二小元素就在其中。
原理:第二小元素只有和最小元素比才會失敗,其他元素和其比都它都能勝出。所以,第二小元素一定在那些和最小元素比較后失敗的元素中。第二小元素一定能和最小元素比較,因為除了和最小元素比以外它都能勝出。
int find_second_smallest_element(int *array
,int length
){vector
<int> new_win
;vector
<int> old_win
;for (int i
= 0; i
< length
; ++i
) {old_win
.push_back(i
);}vector
<vector
<int>> loss(length
);int current_length
= length
;int remainder
;int win_index
,loss_index
;while (current_length
>1){remainder
= current_length
% 2;if(remainder
!=0){new_win
.push_back(old_win
[current_length
/ 2]);}for (int i
= 0; i
< current_length
/2; ++i
){if(array
[old_win
[i
]]<=array
[old_win
[current_length
-i
-1]]){win_index
= old_win
[i
];loss_index
= old_win
[current_length
-i
-1];}else{win_index
= old_win
[current_length
-i
-1];loss_index
= old_win
[i
];}new_win
.push_back(win_index
);loss
[win_index
].push_back(loss_index
);}current_length
= new_win
.size();old_win
.clear();for (int i
= 0; i
< new_win
.size(); ++i
) {old_win
.push_back(new_win
[i
]);}new_win
.clear();}int second_smallest
= loss
[win_index
][0];for (int i
= 1; i
< loss
[win_index
].size(); ++i
) {if(array
[loss
[win_index
][i
]] < array
[second_smallest
]){second_smallest
= loss
[win_index
][i
];}}return array
[second_smallest
];
}
總結
以上是生活随笔為你收集整理的找出第二小元素(算法导论第三版9.1-1题)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。