バブル、クイックソートの実行時間測定

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ビスタ

バブル、クイックソートの実行時間測定

#1

投稿記事 by ビスタ » 18年前

初めまして。

学校ので、バブルソートとクイックソートの実行速度の比較が課題になっているのですが
ランダムで同数の配列を用いているのに
クイックソートの測定時間が不安定で、たいていの場合バブルより遅いんです。
配列数をコマンドで変えてるのですがクイックの方は配列が10倍になったのに
測定時間が減っていたりしました。

ソート自体は出来ていたので
実行時間を測定するプログラムがおかしいのは確かなのですが。

以下はクイックソートのプログラムです
#include<stdio.h>

#include<sys/time.h>

#include<stdlib.h>

#include<time.h>

#ifndef MAX

#define MAX 25

#endif



/*外部関数宣言*/

extern void set_data_t3(int data[/url],int num);

extern void show_data(int data[/url],int num);

extern void swap_data(int data[/url],int i,int j);



/*内部関数*/

void quick_sort(int data[/url],int num);

void quick_sort_f(int data[/url],int l,int r);

int part(int data[/url],int l,int r);


int main()
{
int data[MAX];


	set_data_t3(data,MAX);

	struct timeval start,stop,duration;

	struct timezone JPN;

	JPN.tz_minuteswest=-9*60;

	JPN.tz_dsttime=0;


	if(gettimeofday(&start,&JPN)!=0){

		fprintf(stderr,"err\n");

		return -1;

		}


	time_t start_sec,stop_sec,dura_sec;


	if(time(&start_sec)==(time_t)-1){

		fprintf(stderr,"err\n");

		return -1;

	}

	quick_sort(data,MAX);


	if(gettimeofday(&stop,&JPN)!=0){

		fprintf(stderr,"err\n");

		return -1;

		}

	if(time(&stop_sec)==(time_t)-1){

		fprintf(stderr,"err\n");

		return -1;

		}

	dura_sec =stop_sec - start_sec;

	duration.tv_usec=stop.tv_usec-start.tv_usec;

	
	fprintf(stdout,"%f \n",dura_sec);

	fprintf(stdout,"%x microseconds\n",duration.tv_usec);



	return 0;

}



/*他ソートと合わせるための関数*/

void quick_sort(int data[/url],int num)
{

	quick_sort_f(data,0,num-1);

}

/*クイックソート実体↓*/

void quick_sort_f(int data[/url],int l,int r)
{

	int v;

	if(l>=r){

		return;

	}



	v=part(data,1,r);

	quick_sort_f(data,1,v-1);

	quick_sort_f(data,v+1,r);

}



int part(int data[/url],int l,int r)
{

	int i,j,pivot;


	i=l;

	j=r-1;


	pivot=data[[/url];

	for(;;){

		while(data<pivot)

			i++;

		while((i<j)&&(pivot<=data[j]))

			j--;

		if(i>=j)

			break;

		swap_data(data,i,j);

	}

	swap_data(data,i,r);

	return i;

}



追記ですが
クイックソートプログラムアプリを起動しようとしましたがexeファイルが見つかりません…

バグ

Re:バブル、クイックソートの実行時間測定

#2

投稿記事 by バグ » 18年前

簡単なミリ秒単位での計測サンプルです。ただし、多少の誤差はどうしても出ますので、ご容赦を…。
環境がWindowsで、言語がC++ならば高精度タイマーもありますが、これも完全ではないです…(^_^;)
#include	<stdio.h>
#include	<time.h>

int main(void)
{
	clock_t	Start, Finish;

	/* 開始時の時間を取得 */
	Start = clock();



	/* ここに何らかの処理を書き込む */



	/* 処理終了時の時間と、開始時の時間の差(経過した時間…msec単位)を取得 */
	Finish = clock() - Start;

	/* 経過時間を表示 */
	printf("%d", Finish);

	return 0;
}

ビスタ

Re:バブル、クイックソートの実行時間測定

#3

投稿記事 by ビスタ » 18年前

<バグさん

あ~、環境書くの忘れてたんですね…私。
SUSE-Linux9.0 のC言語で コンパイラがgccなんですけど…

取りあえずそれでやってみます。
一応解決かどうかは保留しておきます…。

(学校のPC使わないとできないので)

Lbfuvab

無題

#4

投稿記事 by Lbfuvab » 18年前

コンパイラはbcc55で開発環境としてBCC Developerを使っているのですが
以下のコードを打ち込んだときエラーが発生しました。(リンク時に)
Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照
コードは
#include <windows.h>

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
char szClassNme[/url] = "firstSDK";

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst,LPSTR lpszCmdLine, int nCmdShow){
HWND hWnd;
    MSG msg;
    WNDCLASS myProg;
        myProg.style = CS_HREDRAW | CS_VREDRAW;
        myProg.lpfnWndProc=WndProc;
        myProg.cbClsExtra      =0;
        myProg.cbWndExtra      =0;
        myProg.hInstance        =hInstance;
        myProg.hIcon            =NULL;
        myProg.hCursor      =LoadCursor(NULL, IDC_ARROW);
        myProg.hbrBackground    =GetStockObject(WHITE_BRUSH);
        myProg.lpszMenuName  =NULL;
        myProg.lpszClassName    =szClassNme;
        if (!RegisterClass(&myProg))
            return FALSE;
    hWnd = CreateWindow(szClassNme,
        "はじめの一歩",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        NULL,
        NULL,
        hInstance,
        NULL);
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (msg.wParam);
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
    switch (msg) {
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return(DefWindowProc(hWnd, msg, wParam, lParam));
    }
    return (0L);
}
どこが間違っているのか分かりません。
どうか教えてください

バグ

Re:無題

#5

投稿記事 by バグ » 18年前

おそらく、プロジェクトの設定が、WINDOWSアプリではなく、コンソールアプリになっているからではないでしょうか?

toyo

Re:無題

#6

投稿記事 by toyo » 18年前

一般にC, C++のプログラムは main( ) 関数から始まりますよね。
Windowsもコンソールアプリはmain( )で始まります。
ところが画面にWindowとして表示されるいわゆるWindowsアプリはmain( )ではなくWinMain( )関数から始まります。
コンパイルの際にはコンソール用なのかWindows用なのかをコンパイラに指示しないといけません。
BCC Developerではメニューの「プロジェクト」->「プロジェクト設定」でコンソールアプリケーションかWindowsアプリケーションかを指定できます。

Lbfuvab

Re:無題

#7

投稿記事 by Lbfuvab » 18年前

すいませんでした。
BCC Developerを一度消してダウンロードしなおしたので
デフォルトプロジェクトがコンソールに成ってました。(謝

Hermit

Re:無題

#8

投稿記事 by Hermit » 18年前

ここも、http://www9.plala.or.jp/sgwr-t/ も、マルチポストは禁止のようです。
今後はそのあたりも気をつけましょう。

Lbfuvab

Re:無題

#9

投稿記事 by Lbfuvab » 18年前

すいませんでした。

閉鎖

“C言語何でも質問掲示板” へ戻る