Sorting - bubble sort

#include "stdio.h"
#include "string.h"

#define MAX_LIST 50


typedef struct _SqList {
    int data[MAX_LIST];
    int length;
}SqList;

void swap( SqList* L,  unsigned index1, unsigned index2 )
{
    if( index1 >= L->length || index2 >= L->length ) return;

    if( index1 == index2 ) return;

    L->data[index1] = L->data[index1] ^ L->data[index2];

    L->data[index2] = L->data[index1] ^ L->data[index2];

    L->data[index1] = L->data[index1] ^ L->data[index2];
}

enum BUBBLE_SORT_METHOD { PLAIN, FLAG };

//original bubble sort algorithm
void BubbleSortPlain(SqList* L)
{

    int i, j;

    for( i = 0; i < L->length - 1; i++ )
    {
        //every outer loop pick the smallest from the rear of the array
        for( j = L->length-2; j >= i; j-- )
        {  
            //compare adjacent elements and get the smaller move forward
            if( L->data[j] > L->data[j+1] )
                swap(L, j, j+1 ); 
        }
    }
}


//Optimized with a flag indicating should there any swapping occurred in the previous loop
//if there is no swapping, loop should exit prematurely
void BubbleSortFlag(SqList* L)
{
    bool flag = true;
    int i, j;
    for( i = 0; flag && i < L->length - 1; i++ )
    {
        //every outer loop pick the smallest from the rear of the array
        for( j = L->length-2; j >= i; j-- )
        {  
            flag = false;
            //compare adjacent elements and get the smaller move forward
            if( L->data[j] > L->data[j+1] )
            {
                swap(L, j, j+1 ); 
                flag = true;
            }
        }
    }
}

void BubbleSort( SqList* L, BUBBLE_SORT_METHOD bs )
{
    if( bs == PLAIN )
    {
        BubbleSortPlain( L );
    }
    else
    {
        BubbleSortFlag( L );
    }
}


int main()
{
    SqList d;
    int intarr[] = {1,10,23,48,65,31,-21,9,88,100};
    memcpy( d.data, intarr, sizeof(intarr));
    d.length = sizeof(intarr)/sizeof(int);  
    int index = 0;
    printf("Original array:\n");
    for( ; index < d.length; index++ )
        printf(" %d", d.data[index] );
    printf("\nBubble sort...\n");
    BubbleSort( &d, FLAG );
    for( index = 0; index < d.length; index++ )
        printf(" %d", d.data[index] );
    printf("\n");
    return 0;
}

你可能感兴趣的:(Sorting - bubble sort)