퀵소트, 1 Posts.

이산수학 레폿 : 퀵소트 ( Quick Sort )

Date
2008/06/09 17:30
Author
ApPLe
Categories

이산수학 레폿으로 했던 퀵 소트!
약간 진보한 버젼으로 , 소트에 걸린시간도 표시해준다 ㅋ_ㅋ
테스트를 해보니 , 자료 80만개를 정렬하는데는 약 4초가 걸렸다;;
으헉 느리다!!! ㅠㅠ 알고리즘 수정 ㄱㄱ싱.


#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#define SIZE 8

typedef struct timeval TIME;

void QuickSort ( int *pData , int nLow , int nHigh , int nPivot );
void Swap ( int *a , int *b );
void Display ( int *pData );

int Separate ( int *pData , int nLow , int nHigh , int nPivot );

double GetProcTime ( TIME start , TIME end );

int main(void)
{
        int i;
        int aData[SIZE];

        double fTime;

        TIME timestart , timeend;

        srand ( time(NULL) );

        for ( i = 0 ; i < SIZE ; i++ )
        {
                aData[i] = rand() % 100;
        }

        printf ( "Original data  : " );
        Display ( aData );
        printf ( "\n" );

        gettimeofday ( &timestart , NULL );

        QuickSort ( aData , 0 , SIZE , 0 );

        gettimeofday ( &timeend , NULL );

        printf ( "\n" );

        printf ( "After Quick-Sort : " );
        Display ( aData );

        fTime = GetProcTime ( timestart , timeend );
        printf ( "Elapsed Time : %lf Sec.\n" , fTime / 1000000 );

        return 0;
}

void QuickSort ( int *pData , int nLow , int nHigh , int nPivot )
{
        printf ( "Sorting.. -> Pivot [%2d] : " , pData[nPivot] );
        Display ( pData );

        if ( nHigh > nLow )
        {
                nPivot = Separate ( pData , nLow , nHigh , nPivot );
                QuickSort ( pData , nLow , nPivot-1 , nPivot );
                QuickSort ( pData , nPivot+1 , nHigh , nPivot );
        }
}

int Separate ( int *pData , int nLow , int nHigh , int nPivot )
{
        int i, j;
        int nItem;

        nItem = pData[nLow];
        j = nLow;

        for( i = nLow + 1 ; i <= nHigh ; i++ )
        {

                if ( pData[i] < nItem )
                {
                        j++;
                        Swap( &pData[i] , &pData[j] );
                }
        }

        nPivot = j;
        Swap ( &pData[nLow] , &pData[nPivot] );

        return nPivot;
}

void Swap ( int *nA , int *nB )
{
        int nTemp;
        nTemp = *nA;
        *nA = *nB;
        *nB = nTemp;
}

void Display ( int *pData )
{
        int i;

        for ( i = 0 ; i <= SIZE ; i++ )
        {
                printf ( "%2d " , pData[i] );
        }

        printf ( "\n" );
}

double GetProcTime ( TIME start , TIME end )
{
        double fRes = 0;

        fRes = ( end.tv_sec/10000 + end.tv_usec ) - ( start.tv_sec/10000 + start.tv_usec );

        return fRes;
}

ApPLe
2008/06/09 17:30 2008/06/09 17:30
Tag
Trackback
Comments
1