2

2つのソートアルゴリズムがマージソートとクイックソートをマージしてN個の数値をマイクロ秒以上で正確にソートするのにかかる時間を計算したいコードがあります。このように計算された2回は、端末に出力されます。コード(コードの一部):

printf("THE LIST BEFORE SORTING IS(UNSORTED LIST):\n");
printlist(arr,n);
mergesort(extarr,0,n-1);
printf("THE LIST AFTER SORTING BY MERGE SORT IS(SORTED LIST):\n");
printlist(extarr,n);
quicksort(arr,0,n-1);
printf("THE LIST AFTER SORTING BY QUICK SORT IS(SORTED LIST):\n");
printlist(arr,n);

それがどのように行われるかを提供することで私を助けてください.2つの変数を開始停止として取り、それらをそれぞれ関数呼び出しの上と下に保つことによってclock_tを試しましたが、これはまったく役に立たず、常にその差をゼロとして出力します。どのタイプのOSでも問題なく動作することを念頭に置いて、他の方法や機能を提案してください。よろしくお願いします。

4

5 に答える 5

1

次のことを試したかどうかはわかりません。あなたの元の投稿は、あなたがを利用しようとしたと言っていることを知っていますCLOCKS_PER_SEC。使用CLOCKS_PER_SECして実行(stop-start)/CLOCKS_PER_SECすると、秒を取得できます。ダブルはより高い精度を提供します。

#include <time.h>

main()
{
clock_t launch = clock();
//do work
clock_t done = clock();
double diff = (done - launch) / CLOCKS_PER_SEC;
}
于 2012-10-09T01:44:16.763 に答える
1

結果として得られる理由Zeroは、使用しているタイム ソースの解像度が低い可能性があります。これらのタイム ソースは通常、10 ~ 20 ミリ秒ずつ増加します。これは貧弱ですが、それが彼らの働き方です。この時間増分よりも短い時間で並べ替えを行うと、結果は になりますzero。システムの割り込み頻度を増やすことで、この結果を 1 ミリ秒体制に増やすことができます。andWindows Linuxでこれを実現する標準的な方法はありません。彼らにはそれぞれのやり方があります。高周波カウンタを使用すると、さらに高い分解能が得られます。Windows と Linux はそのようなカウンターへのアクセスを提供しますが、コードは少し異なるように見えるかもしれません。

one piece of codeで実行するに値する場合はwindows and linux、時間測定をループで実行することをお勧めします。コードを実行して、ループ内で数百回またはそれ以上の回数を測定し、ループ外の時間をキャプチャします。キャプチャされた時間をループ サイクル数で割り、結果を取得します。

もちろん:これは評価用です。最終的なコードにそれを入れたくありません。 そして:時間分解能が 1 ~ 20 ミリ秒であることを考慮して、適切な測定分解能を得るには、合計時間を適切に選択する必要があります。(ヒント: ループ回数を調整して、少なくとも 1 秒ほど放置します。)

例:

clock_t start, end;

printf("THE LIST BEFORE SORTING IS(UNSORTED LIST):\n");
printlist(arr,n);

start = clock();
for(int i = 0; i < 100; i++){ 
  mergesort(extarr,0,n-1);
}
end   = clock();
double diff = (end - start) / CLOCKS_PER_SEC;

// and so on...

printf("THE LIST AFTER SORTING BY MERGE SORT IS(SORTED LIST):\n");
printlist(extarr,n);
quicksort(arr,0,n-1);
printf("THE LIST AFTER SORTING BY QUICK SORT IS(SORTED LIST):\n");
printlist(arr,n);
于 2012-10-09T07:13:53.693 に答える
1

Linux ではgettimeofday関数を、Windows ではtimeGetTimeを呼び出すことができます。並べ替え関数を呼び出す前と並べ替え関数を呼び出した後にこれらの関数を呼び出して、差をとります。

詳細については、man ページを確認してください。それでも具体的なデータを取得できない場合 (データセットが小さいため、所要時間が短すぎる可能性があるため)、「n」回の反復の時間を一緒に測定してから、1 回の実行の時間を推測することをお勧めします。または、ソートするデータ・セットのサイズを増やしてください。

于 2012-10-09T01:36:02.567 に答える