码迷,mamicode.com
首页 > 编程语言 > 详细

排序小结

时间:2016-09-29 01:53:43      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:

插入排序(O(N2

void InsertionSort( ElementType A[ ], int N )
{
    int j, P;
    ElementType Tmp;

    for( P = 1; P < N; P++ )
    {
        Tmp = A[ P ];
        for( j = P; j > 0 && A[ j - 1 ] > Tmp; j-- )
            A[ j ] = A[ j - 1 ];
        A[ j ] = Tmp;
    }
}

堆排序(2NlogN-O(NloglogN))

#define LeftChild( i )  ( 2 * ( i ) + 1 )

void PercDown( ElementType A[ ], int i, int N )
{
    int Child;
    ElementType Tmp;

    for( Tmp = A[ i ]; LeftChild( i ) < N; i = Child )
    {
        Child = LeftChild( i );
        if( Child != N - 1 && A[ Child + 1 ] > A[ Child ] ) // A[ Child + 1 ] < A[ Child ]
            Child++;
        if( Tmp < A[ Child ] )          //Tmp > A[ Child ]
            A[ i ] = A[ Child ];        //两边的比较同时更改的话,就变成从大到小排序
        else
            break;
    }
    A[ i ] =Tmp;
}

void Heapsort( ElementType A[ ], int N )
{
    int i;

    for( i = N / 2; i >= 0; i-- )  /* BuildHeap */
        PercDown( A, i, N );
    for( i = N - 1; i > 0; i-- )
    {
        Swap( &A[ 0 ], &A[ i ] );  /* DeleteMax */
        PercDown( A, 0, i );
    }
}

归并排序O(NlogN)

void Merge( ElementType A[ ], ElementType TmpArray[ ],int Lpos, int Rpos, int RightEnd )
{
    int i, LeftEnd, NumElements, TmpPos;

    LeftEnd = Rpos - 1;
    TmpPos = Lpos;
    NumElements = RightEnd - Lpos + 1;

    /* main loop */
    while( Lpos <= LeftEnd && Rpos <= RightEnd )
        if( A[ Lpos ] <= A[ Rpos ] )
            TmpArray[ TmpPos++ ] = A[ Lpos++ ];
        else
            TmpArray[ TmpPos++ ] = A[ Rpos++ ];

    while( Lpos <= LeftEnd )  /* Copy rest of first half */
        TmpArray[ TmpPos++ ] = A[ Lpos++ ];
    while( Rpos <= RightEnd ) /* Copy rest of second half */
        TmpArray[ TmpPos++ ] = A[ Rpos++ ];

    /* Copy TmpArray back */
    for( i = 0; i < NumElements; i++, RightEnd-- )
        A[ RightEnd ] = TmpArray[ RightEnd ];
}

void MSort( ElementType A[ ], ElementType TmpArray[ ],int Left, int Right )
{
    int Center;

    if( Left < Right )
    {
        Center = ( Left + Right ) / 2;
        MSort( A, TmpArray, Left, Center );
        MSort( A, TmpArray, Center + 1, Right );
        Merge( A, TmpArray, Left, Center + 1, Right );
    }
}

void Mergesort( ElementType A[ ], int N )
{
    ElementType *TmpArray;

    TmpArray = malloc( N * sizeof( ElementType ) );
    if( TmpArray != NULL )
    {
        MSort( A, TmpArray, 0, N - 1 );
        free( TmpArray );
    }
    else
        FatalError( "No space for tmp array!!!" );
}

快速排序O(NlogN)

/* Return median of Left, Center, and Right */
/* Order these and hide the pivot */
ElementType Median3( ElementType A[ ], int Left, int Right )
{
    int Center = ( Left + Right ) / 2;

    if( A[ Left ] > A[ Center ] )
        Swap( &A[ Left ], &A[ Center ] );
    if( A[ Left ] > A[ Right ] )
        Swap( &A[ Left ], &A[ Right ] );
    if( A[ Center ] > A[ Right ] )
        Swap( &A[ Center ], &A[ Right ] );

    /* Invariant: A[ Left ] <= A[ Center ] <= A[ Right ] */

    Swap( &A[ Center ], &A[ Right - 1 ] );  /* Hide pivot */
    return A[ Right - 1 ];                /* Return pivot */
}



#define Cutoff ( 3 )
void Qsort( ElementType A[ ], int Left, int Right )
{
    int i, j;
    ElementType Pivot;

    if( Left + Cutoff <= Right )
    {
        Pivot = Median3( A, Left, Right );
        i = Left;
        j = Right - 1;
        for( ; ; )
        {
            while( A[ ++i ] < Pivot ) { }
            while( A[ --j ] > Pivot ) { }
            if( i < j )
                Swap( &A[ i ], &A[ j ] );
            else
                break;
        }
        Swap( &A[ i ], &A[ Right - 1 ] );  /* Restore pivot */

        Qsort( A, Left, i - 1 );
        Qsort( A, i + 1, Right );
    }
    else  /* Do an insertion sort on the subarray */
        InsertionSort( A + Left, Right - Left + 1 );
}


/* This code doesn‘t work; it‘s Figure 7.15. */
//A[i] = A[j] = Pivot时,程序死循环
#if 0
/* START: fig7_15.txt */
i = Left + 1;
j = Right - 2;
for( ; ; )
{
    while( A[ i ] < Pivot ) i++;
    while( A[ j ] > Pivot ) j--;
    if( i < j )
        Swap( &A[ i ], &A[ j ] );
    else
        break;
}
#endif

void Quicksort( ElementType A[ ], int N )
{
    Qsort( A, 0, N - 1 );
}

 

排序小结

标签:

原文地址:http://www.cnblogs.com/zzy19961112/p/5815283.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!