Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Многопутевое слияние


Автор: necroo 31.5.2012, 22:04
Здравствуйте пользователи форума... если у кого нибудь есть из старых запасов внешняя сортировка многопутевым слиянием ... помогите пожалуйста ... только её осталось добавить . smile  smile 

ну на всякий имеется код 
Код

#include <iostream.h>
#include <conio.h>
#include <stdlib.h>

#define MAXNUMBER 10

int base[MAXNUMBER+1],
   b1[MAXNUMBER+2],
   b2[MAXNUMBER+2],
   b3[MAXNUMBER+2],
   b4[MAXNUMBER+2];

int merges( int *dest, int *f1, int c1, int *f2, int c2)
//сливает две последовательности в одну
//возвращает число вставленных элементов
{ int i=0;
 int t1=0,t2=0;
 int *tf1,*tf2;
 while(c1>0||c2>0)
 { if(c1>0)t1=1;
   if(c2>0)t2=1;
   tf1=f1;tf2=f2;
   do
   {
   i++;
   if(t1&&t2) { if(*(f1)<*(f2)) *(dest++)=*(f1++);
else *(dest++)=*(f2++);
      }
   else if(t1){ *(dest++)=*(f1++);}
    else if(t2){ *(dest++)=*(f2++);}
   if(tf1!=f1) { tf1=f1;if(*(f1)<*(f1-1)) t1=0;}
   if(tf2!=f2) {tf2=f2;if(*(f2)<*(f2-1)) t2=0; }
   }while(t1||t2);
   c1--;c2--;
 };
 return i;
}
int number_of_serieses()
{ int *master;
 master=base;
 int j=1;
 for(int i=0;i<MAXNUMBER;i++)
  { if(*(master)<*(master-1)) j++;
    master++;
  }
 return j;
}
void split( int * master, int *f1, int *f2, int *f3, int *f4)
//разбивает последовательность по подпоследовательностям
{ int *t1,*t2,*t3,*t4;
 t1=f1;t2=f2;t3=f3;t4=f4;
 f1++;f2++;f3++;f4++;
 int i=1;
 *(f1++)=*(master++);
 int j=1,sn=double(number_of_serieses()+1)/4,n=1;
 sn=sn>0?sn:1;
 *(t1)=0;
 *(t2)=0;
 *(t3)=0;
 *(t4)=0;
 do
 { if(*(master)<*(master-1))
   { switch(j)
     { case 1:*(t1)+=1;n++;break;
case 2:*(t2)+=1;n++;break;
case 3:*(t3)+=1;n++;break;
case 4:*(t4)+=1;n++;break;
     }
     if(n>sn) { j=j<4?j+1:j;n=1; }
   }
   switch(j)
   { case 1: *(f1++)=*(master++);break;
     case 2: *(f2++)=*(master++);break;
     case 3: *(f3++)=*(master++);break;
     case 4: *(f4++)=*(master++);break;
   }
 }
 while (++i<MAXNUMBER);
 *(t1)+= j!=1 ?0:*(t1)+1;
 *(t2)+= j!=2 ?0:*(t2)+1;
 *(t3)+= j!=3 ?0:*(t3)+1;
 *(t4)+= j!=4 ?0:*(t4)+1;
 *(f1)=0;
 *(f2)=0;
 *(f3)=0;
 *(f4)=0;
}

void fillmaster()
{ randomize();
 for(int i=0;i<MAXNUMBER;i++)
{   cout << i <<":";
  cin >> base[i];//=random(10000);
}
 base[i]=0;
}
void write(int *matrix)
{ for(int i=0;i<MAXNUMBER;i++)
  {
    if (!(i%20)) {cout << "\n----------------------";
  getch();
 };
    cout << "\n[" << i << "]\t"<< *(matrix++);
  }
}
void main()

{ clrscr();
fillmaster();
//  write(base);
 getch();

 cout<<"\nNumber Series=" << number_of_serieses();
while(number_of_serieses() != 1)
{
 split(base,b1,b2,b3,b4);
 int shift=merges(base,b1+1,*(b1),b2+1,*(b2));
 merges(base+shift,b3+1,*(b3),b4+1,*(b4));
//  cout<<"\nNumber Series=" << number_of_serieses();
//  getch();
}
 write(base);
 getch();
 cout<<"\nThe END - - - - - - - - -\n";
}

в 2005 ругается на <iostream.h>
в 2010 на cout ... 

Автор: feodorv 31.5.2012, 22:54
Цитата(necroo @  31.5.2012,  23:04 Найти цитируемый пост)
в 2005 ругается на <iostream.h>

Код

#include <iostream>


Цитата(necroo @  31.5.2012,  23:04 Найти цитируемый пост)
в 2010 на cout ... 

Код

using namespace std;


Автор: necroo 4.6.2012, 21:59
спс) и так зашибись) презентацию разрешили сделать)

Автор: borisbn 4.6.2012, 23:07
Цитата(necroo @  4.6.2012,  21:59 Найти цитируемый пост)
спс) и так зашибись) презентацию разрешили сделать) 

честно говоря - набор букаф

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)