Страница 1 из 1

Пожалуйста, помогите с блок-схемой

Добавлено: 29 янв 2010, 00:02
Niki
Задача: Алгоритм сортирует записи r1,...rn, используя вспомогательную таблицу COUNT,..., COUNT[v] в предположении что все ключи - целые числа в диапазоне u<=Kj<=v, 1<=j<=N. На последнем этапе выполнения алгоритма все записи в требуемом порядке переносятся в область выводы S1,..., Sn.

Вот программа:

Код: Выделить всё

#include "Sorter.h"
#include <math.h>
CSorter::CSorter( int size , int limit)
{
        arrSize = size;
        arrayToSort = new int [arrSize];
        generateRandomArray ( arrSize , limit );
}

CSorter::~CSorter()
{
        if(arrayToSort != NULL)
        {
                delete[] arrayToSort;
                arrayToSort = NULL;
        }
}

AnsiString CSorter::getArray ( int sortType )
{
        AnsiString strSortedArray("");
        int *buf = new int[arrSize];
        if ( sortType == 0 )
                buf = sortByShell();
        if ( sortType == 1 )
                buf = countSort();
        if ( sortType == 2)
                buf = arrayToSort;
        for (int i = 0; i < arrSize; i++)
                strSortedArray += "{" + IntToStr( buf[i] ) + "}";
        if(buf != arrayToSort && buf != NULL)
        {
                delete[] buf;
                buf = NULL;
        }
        return  strSortedArray;
}

int* CSorter::sortByShell( )
{
    int* sortedArray = arrayToSort;
    int d = arrSize, i, j;
    while (d > 0)
    {
        d /= 2;
 
       for (i = d; i < arrSize; i++) {
            int tmp = sortedArray[i];
            for (j = i-d; (j >= 0) && (sortedArray[j] > tmp); j -= d) {
                sortedArray[j+d] = sortedArray[j];
            }
            sortedArray[j+d] = tmp;
        }
    }
    return sortedArray;
}

int *CSorter::countSort()
{
        int *sortedArray = new int[arrSize];
        int **Count = new int*[2];
        for (int i = 0; i < 2; i++)
                Count[i]  = new int [arrSize];
        for (int i = 0; i < arrSize; i++)
                Count[0][i] = arrayToSort[i];
        for (int i = 0; i < arrSize; i++ )
                Count[1][i] = 0;
        for ( int i = arrSize - 1; i >= 1; i-- )
                for ( int j = i - 1; j >= 0; j --)
                {
                        if (arrayToSort[i] > arrayToSort[j])
                                Count[1][i]++;
                        else
                               Count[1][j]++;
                }
        for ( int i = 0; i < arrSize; i++)
                sortedArray[ Count[1][i] ] = Count[0][i];
        delete[] Count;
        return sortedArray;
}

int* CSorter::bubbleSort( int *array)
{
        int buf(0);
        if(array == NULL)
                return NULL;
        for (int i = 1; i <= arrSize ; i ++)
                for(int k = i  - 1; k < arrSize - i; k++)
                        if( array[k] > array[k+1] )
                        {
                                buf = array[k + 1];
                                array[k  + 1] = array[k];
                                array[k] = buf;
                        }
       return array;
}

void CSorter::generateRandomArray ( int size , int limit )
{
        if( size <= 0 || limit <= 0)
           return;
        for ( int i = 0; i < size; i++ )
                arrayToSort[i] = abs( rand ()%limit ) ;
}
Очень нужна помощь. Заранее благодарна!