Форум программистов, компьютерный форум CyberForum.ru

сортировка прямым слиянием - C++

Восстановить пароль Регистрация
 
_Колючий_
3 / 3 / 2
Регистрация: 05.08.2012
Сообщений: 88
13.08.2013, 01:22     сортировка прямым слиянием #1
Попытался реализовать алгоритм, но в коде есть ошибки. По всей видимости напортачил в фазе слияния
Буду благодарен, если укажете в чем я не прав

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
template<class T>
void sort2Phase(string &adress)
{ifstream a, b, c;  ofstream B, C, A;
int countA=0;           //счетчек эллементов в исходном файле
T buf, bufB, bufC;      //буферные переменные
int portion=1;          //Размер порции
int nb, nc;             //счетчики считанных из групп эллементов
 
a.open(adress);         //определение числа эллементов в исходном файле
while (a>>buf)
    countA++;
a.close();
 
 
 
while (portion<countA-countA/2)              
{ 
/////////////////////---------------Фаза разделения---------------/////////////////////
B.open(adress+"Btmp.txt"); C.open(adress+"Ctmp.txt"); a.open(adress);
for (int i=0; i<countA/2;i++)                                                       
{a>>buf; 
B<<buf<<' '; 
}
 
for(int i=countA/2; i<countA; i++)
{a>>buf; 
C<<buf<<' '; 
} 
 
 B.close(); C.close(); a.close();
/////////////////////---------------Фаза слияния-------------------/////////////////////
 
b.open(adress+"Btmp.txt"); c.open(adress+"Ctmp.txt"); A.open(adress);           
nb=nc=1; b>>bufB; c>>bufC; 
while (true)
{
    if ( (!c.eof()) && (b.eof()) )                         //Если конец файла С
    {while (c>>bufC)
        A<<bufC<<' ';
    A.close(); b.close(); c.close(); break;}
    else
    if((c.eof()) && (!b.eof()))                           //Если конец файла В
    {while(b>>bufB)
      A<<bufB<<' ';
    A.close(); b.close(); c.close(); break;}
    else
    if(c.eof() && b.eof())                                //есликонец В и С 
    {
    A.close(); b.close(); c.close(); break;
    }
 
    if((nb<=portion) && (nc<=portion))                   
      {if (bufB<bufC)
         A<<bufB<<' '; b>>bufB; nb++; continue;}
    else {A<<bufC<<' '; c>>bufC; nc++; continue;}
 
    if ((nb>portion) && (nc<=portion))
    {while (nc<=portion)
    {A<<bufC; c>>bufC; nc++;}  continue;}
 
    if ((nb<=portion) && (nc>portion))
    {while (nb<=portion)
    {A<<bufB; b>>bufB; nb++;}  continue;}
 
    if ((nb>portion) && (nc>portion))
    {
    nb=nc=0;  continue; 
    }
}
//////////////////////////////////////////////////////////////
portion=portion*2;                                         //удвоение считываемых порций
}
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2013, 01:22     сортировка прямым слиянием
Посмотрите здесь:

Сортировка слиянием С++ C++
C++ Сортировка слиянием
шейкерная сортировка + сортировка слиянием C++
C++ Сортировка слиянием
Сортировка слиянием C++
Массив: Сортировка прямым выводом C++
Сортировка слиянием C++
Сортировка односвязного циклического списка (Прямым включением) C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 13:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru