17void PmergeMe::resetCounter() { _comparisonCount = 0; }
18long PmergeMe::getComparisonCount()
const {
return _comparisonCount; }
21long PmergeMe::getTimeStamp() {
23 gettimeofday(&tv, NULL);
24 return tv.tv_sec * 1000000 + tv.tv_usec;
282 bool hasStraggler = vec.
size() % 2 != 0;
284 straggler = vec.
back();
288 for (
size_t i = 0; i < vec.
size(); i += 2) {
289 if (vec[i] < vec[i + 1]) {
298 for (
size_t i = 0; i < pairs.
size(); ++i) {
305 for (
size_t i = 0; i < pairs.
size(); ++i) {
306 if (pairs[i].first == mainChain[0]) {
307 mainChain.
insert(mainChain.
begin(), pairs[i].second);
314 size_t lastInserted = 1;
315 for (
size_t k = 2;; ++k) {
317 long jacobsthal_k = (1L << k) - ((k % 2 == 0) ? 1 : -1);
320 size_t insertCount = jacobsthal_k - lastInserted;
321 if (
static_cast<size_t>(jacobsthal_k) > pairs.
size()) {
322 insertCount = pairs.
size() - lastInserted;
325 for (
size_t i = 0; i < insertCount; ++i) {
326 size_t pairIndex = jacobsthal_k - i - 1;
327 if (pairIndex >= pairs.
size())
330 int valueToInsert = pairs[pairIndex].second;
332 mainChain.
insert(it, valueToInsert);
335 lastInserted += insertCount;
336 if (lastInserted >= pairs.
size())
343 mainChain.
insert(it, straggler);
358 bool hasStraggler = deq.
size() % 2 != 0;
360 straggler = deq.
back();
364 for (
size_t i = 0; i < deq.
size(); i += 2) {
365 if (deq[i] < deq[i + 1]) {
373 for (
size_t i = 0; i < pairs.
size(); ++i) {
378 for (
size_t i = 0; i < pairs.
size(); ++i) {
379 if (pairs[i].first == mainChain[0]) {
380 mainChain.
insert(mainChain.
begin(), pairs[i].second);
385 size_t lastInserted = 1;
386 for (
size_t k = 2;; ++k) {
387 long jacobsthal_k = (1L << k) - ((k % 2 == 0) ? 1 : -1);
390 size_t insertCount = jacobsthal_k - lastInserted;
391 if (
static_cast<size_t>(jacobsthal_k) > pairs.
size()) {
392 insertCount = pairs.
size() - lastInserted;
395 for (
size_t i = 0; i < insertCount; ++i) {
396 size_t pairIndex = jacobsthal_k - i - 1;
397 if (pairIndex >= pairs.
size())
400 int valueToInsert = pairs[pairIndex].second;
402 mainChain.
insert(it, valueToInsert);
405 lastInserted += insertCount;
406 if (lastInserted >= pairs.
size())
412 mainChain.
insert(it, straggler);
425 for (
int i = 1; i < argc; ++i) {
428 if (*end !=
'\0' || val <= 0 || val > INT_MAX) {
437 for (
size_t i = 0; i < vec.
size(); ++i) {
443 long startVec = getTimeStamp();
445 long endVec = getTimeStamp();
446 double timeVec =
static_cast<double>(endVec - startVec);
450 for (
size_t i = 0; i < vec.
size(); ++i) {
456 long startDeq = getTimeStamp();
458 long endDeq = getTimeStamp();
459 double timeDeq =
static_cast<double>(endDeq - startDeq);
462 std::cout <<
"Time to process a range of " << argc - 1 <<
" elements with std::vector : " << timeVec <<
" us"
464 std::cout <<
"Time to process a range of " << argc - 1 <<
" elements with std::deque : " << timeDeq <<
" us"
マージ挿入ソートアルゴリズムを実装し、異なるコンテナでのパフォーマンスを比較するPmergeMeクラスを提供します。
マージ挿入ソート(フォード・ジョンソンアルゴリズム)を用いて数値シーケンスをソートするクラス。
void sortAndCompare(int argc, char **argv)
コマンドライン引数をパースし、ソートを実行して結果を比較・表示します。
void mergeInsertSort(std::vector< int > &arr)
std::vectorに対してマージ挿入ソートを実行します。