Merge-sort

来源:互联网 发布:测试软件工具 编辑:程序博客网 时间:2024/05/21 07:08
#include <stdio.h>#include <iostream>#include <string.h>#define MIN( x, y)( (x)<(y)?(x):(y))typedef int   INDEX;typedef class MergeSort {        public:                MergeSort( void);                ~MergeSort( void);                bool SetArray( int *array, INDEX left, INDEX right);                bool sort( void);                bool show( void);        private:                bool exchange( INDEX a, INDEX b);//exchange between two values                bool subsort( int width);//sort this->array with unit of  this->width.                bool sort2Arr( INDEX arr1, int len1, INDEX arr2, int len2);                int                *array;                int                *array_back;                INDEX        left;                INDEX        right;} MERGESORT;MergeSort::MergeSort(void){        this->array = NULL;        this->array_back = NULL;        this->left = 0;        this->right = 0;}MergeSort::~MergeSort( void){        if( NULL!=this->array_back)        {                delete []this->array_back;                this->array_back = NULL;        }}bool MergeSort::SetArray(int * array,INDEX left,INDEX right){        if( left >= right)        {                return false;        }        this->array = array;        this->array_back = new int[right-left+1];        this->left = left;        this->right = right;        return true;}bool MergeSort::sort(void){        if( (this->array==NULL)                ||( this->array_back==NULL))                        return false;        int width = 1;        while( width < (this->right - this->left + 1) )        {                this->subsort( width);//sort sublists                width *= 2;        }        return true;}bool MergeSort::exchange(INDEX a,INDEX b){        inttmp ;        tmp = this->array[a] ;        this->array[a] = this->array[b] ;        this->array[b] = tmp ;        return true;}#if 0static bool ShowArr( int array[], INDEX left, INDEX right){        if( array==NULL)                return false;        int        i;        printf(" [left = %3d]  ", left);        for( i=0; i<( right - left +1); i++)        {                printf("%4d", array[i]);        }        printf("   [right = %3d]\n", right );        return true;}#endifbool MergeSort::subsort( int width){        if( width<0)        {                std::cout<<"warn : "<<__FILE__<<__LINE__<<std::endl;                return false;        }        INDEX        cur = this->left;        while( cur + width <= this->right)        {                this->sort2Arr( cur, width, cur + width, MIN( width, this->right-cur-width+1));                cur += 2*width;        }        memcpy( this->array,  this->array_back, (this->right - this->left + 1)*sizeof(int));        return true;}bool MergeSort::sort2Arr(INDEX arr1,int len1,INDEX arr2,int len2){        if( len2<=0)                return true;        int        i1 = 0;        int        i2 = 0;        int        i = 0;        while( ( i1<len1)&&( i2<len2) )        {                if( this->array[arr1 + i1] < this->array[arr2 + i2])                {                        this->array_back[arr1 + i] = this->array[arr1 + i1];                        i1++;                        i ++;                }                else                {                        this->array_back[arr1 + i] = this->array[arr2 + i2];                        i2++;                        i++;                }        }        while( i1<len1)        {                this->array_back[ arr1 + i] = this->array[arr1 + i1];                i++;                i1++;        }        //printf("[i1 = %d, len1 = %d], arr1 = %d \n", i1, len1, arr1);        //printf("----------------[i2 = %d, len2 = %d], arr2 = %d \n", i2, len2, arr2);        while( i2<len2)        {                //printf("[ arr1 + i] = %d,\n", arr1+ i);                this->array_back[ arr1 + i] = this->array[arr2 + i2];                i++;                i2++;        }        return true;}bool MergeSort::show(void){        if( this->array==NULL)                return false;        int        i;        printf(" [left = %3d]  ", this->left);        for( i=0; i<( this->right - this->left +1); i++)        {                printf("%4d", this->array[i]);        }        printf("   [right = %3d]\n", this->right );        return true;}#define ARR_LEN15static int        Arr[ARR_LEN] = { 0,1,4,7,2,5,8,3,6,9, 0, 8, 8, 9};int main(){        MERGESORT sort;        sort.SetArray( Arr, 0, ARR_LEN-1);        sort.show( );        sort.sort( );        sort.show( );        return 0;}


 

0 0
原创粉丝点击