Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.02.2011, 18:02   #1
mastar
Пользователь
 
Регистрация: 04.04.2010
Сообщений: 18
Смущение сортировка слиянием и цифровым способом

одмогните Уважаемые программисты! Есть прога сортировки для массивов (для данных с произвольным доступом)..
Необходимо реализовать алгоритмы сортировки для данных с последовательным доступом (для списков)
Подправьте пожалуйста!
Как это сделать, помогите!
Код:
#include <stdio.h>
#include <iostream.h>
#include <stdlib.h>
#include <memory.h>
#pragma hdrstop
 
//максимальная длина массива
const int maxn=500;
//максимальная величина чисел в массиве
const int maxelement=99;
 
int ar[maxn+1],br[maxn+1],cr[maxn+1];
int temp[maxn+1];
int kolc,kolm;
int t;
 
//---------------------------------------------------------------------------
 
//метод цифровой сортировки
int digits(int size,int* arr)
{
 
        int i, j, k, r, w, uk2, ch;
        int MM[10][maxn];//массив для хранения чисел по одному числу
        int uk[10];//массив указателей на строки массива ММ
        w=maxelement; r=1;
        while (1)//цикл для нахождения МАХ разряда чисел исх. массива
                {w=(w-w%10)/10;
                if (w==0) break;
                r++;}
        for (k=1;k<=r;k++)//цикл для прогонки чисел по разрядам
                {memset(MM,0,sizeof(MM));//обнуляем промежуточный массив
                for (i=0;i<=9;i++) {uk[i]=1;}//ставим указатели на 1-е ячейки
                for (i=1;i<=size;i++)//в цикле проверяем все числа исх. массива и сортируем по цифре i разряда
                        {ch=arr[i];
                        for (j=1;j<k;j++) {ch=(ch-ch%10)/10;}
                        w=ch%10; kolc++;// !!! считаем кол-во сравнений
                        MM[w][uk[w]]=arr[i]; kolm++;// !!! считаем кол-во пересылок
                        uk[w]++;}
                uk2=1;//указатель для записи в исходный массив
                for (i=0;i<=9;i++)//переписываем числа из промежуточного в исходный массив
                        {for (j=1;j<uk[i];j++)
                                {arr[uk2]=MM[i][j]; kolm++;// !!! считаем кол-во пересылок
                                uk2++;}}}
 
        return 0;
}
//само слияние двух частей массива
int merge(int* arr,int l, int cer,int r)
{
 
        int i=l;
        int k=cer+1;
        int j=0;
        //обнуляем временный массив
        memset(temp,0,sizeof(temp));
        //сливаем из двух частей в темп наименьший
        while (i<=cer && k<=r)
        {
                kolm++;// !!! считаем кол-во пересылок
                kolc++;// !!! считаем кол-во сравнений
                if (arr[i]<arr[k]){temp[j]=arr[i]; j++; i++;}
                else {temp[j]=arr[k]; j++; k++;}
        }
        //дописываем из правой части
        while (k<=r) 
        {
                kolm++;// !!! считаем кол-во пересылок
                temp[j]=arr[k]; j++; k++;
        }
        //дописываем из левой части
        while (i<=cer)
        {                                 
                kolm++;// !!! считаем кол-во пересылок
                temp[j]=arr[i]; j++; i++;
        }
        //переписываем в массив
        for (j=0; j<r-l+1; j++) {arr[l+j]=temp[j]; kolm++;}// !!! считаем кол-во пересылок
        return 0;
}
//рекурсивная сортировка слиянием
int sort(int* arr,int l,int r)
{
        //l-левая граница , r-правая, она должна быть больше
        if (l>=r) return 0;
        int cer=(l+r)>>1;//середина отрезка
        //сортируем левую и правую чатси
        sort(arr,l,cer);
        sort(arr,cer+1,r);
        //сливаем их
        merge(arr,l,cer,r);
        return 0;
}
 
 
//метод слияния
int sli(int size,int* arr)
{
        int i,k,b,c,m;
        kolc=0; kolm=0;
        sort(arr,1,size);
        return 0;
}
 
 
#pragma argsused
int main(int argc, char* argv[])
{
 
        randomize();
 
        int n;
        //делаем ввод данных
        printf("Enter n= ",&n);
        scanf("%i",&n);
        //все числа случайные
        for (int i=1; i<=n; i++)
                {ar[i]=random(maxelement+1);
                //cout<<i<<"-el="<<ar[i]<<"   ";
                }
        cout<<"\n\n";
        //сортируем массив разними методами
        memcpy(br,ar,sizeof(ar)); memcpy(cr,ar,sizeof(ar)); 
        //сортируем и выводим количество пересылок и сравнений
        digits(n,br); printf("Digits Sort:  m=%i c=%i\n",kolm,kolc);
        //for (int i=1; i<=n; i++) {cout<<i<<"-el="<<br[i]<<"   ";}
        cout<<"\n\n";
        sli(n,cr); printf("Sli Sort:  m=%i c=%i\n",kolm,kolc);
        //for (int i=1; i<=n; i++) {cout<<i<<"-el="<<cr[i]<<"   ";}
 
        getchar(); getchar();
 
        return 0;
}
С Уважением! Очень надеюсь на вашу помощь...

Последний раз редактировалось Stilet; 22.02.2011 в 18:22.
mastar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Внешняя сортировка слиянием Antihrist174 Паскаль, Turbo Pascal, PascalABC.NET 0 22.05.2010 11:43
Сортировка слиянием Aндрей Общие вопросы C/C++ 3 15.04.2010 09:47
Сортировка слиянием maxflint Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 05.12.2009 20:41
Сортировка слиянием файлов [MI_nor] Общие вопросы C/C++ 1 01.06.2009 20:56