Здравствуйте. Помогите пожалуйста. Не работает двухфазная сортировка простым слиянием. Вот код:
Код:
#include "stdafx.h"
#include <windows.h>
#include <string>
#include <conio.h>
#include <time.h>
#include<iostream>
using namespace std;
char __s[100];
char *OEM(char *s)
{
AnsiToOem(s,__s);
return &__s[0];
}
int n,k;
void File_vivod(FILE *f)
{
int x;
while (fread (&x,sizeof(int),1,f))
cout<<x<<' ';cout<<'\n';
}
//******************************************
void Fcopy (FILE *in,FILE *out)
{
int x;
while (fread (&x,sizeof(int),1,out))
fwrite(&x,sizeof(int),1,in);
}
//******************************************
void create_file()
{
FILE *a;
cout<<OEM("Введите количество символов ");
cin>>n;
int x;
a=fopen("main.txt","wb");
for (int i=0;i<n;i++)
{
x=rand()%100;
fwrite(&x,sizeof(int),1,a);
}
fclose (a);
fopen("main.txt","rb");
cout<<OEM("Исходный массив ")<<'\n';File_vivod(a);
fclose (a);
}
//******************************************
void refile()
{
FILE *beg,*a;
beg=fopen("main.txt","rb");
a=fopen("File.txt","wb");
Fcopy(a,beg);
fclose (beg);
fclose (a);
}
//******************************************
void razbienie(FILE *ish,FILE *b,FILE *c,int kol_v_gruppah)
{
bool a_b=1;
int x,i=0;
cout<<OEM("Разбиение")<<'\n';
while (fread (&x,sizeof(int),1,ish))
{
if(a_b)
{
fseek(ish,sizeof(int)*(-1),SEEK_CUR);
for(i=0;i<kol_v_gruppah;i++)
{
if(fread (&x,sizeof(int),1,ish))
fwrite(&x,sizeof(int),1,b);
}
a_b=0;
}
else
{
fseek(ish,sizeof(int)*(-1),SEEK_CUR);
for(i=0;i<kol_v_gruppah;i++)
{
if(fread (&x,sizeof(int),1,ish))
fwrite(&x,sizeof(int),1,c);
}
a_b=1;
}
}
}
//******************************************
void sliyanie(FILE *ish,FILE *b,FILE *c,int kol_v_gruppah)
{
int x,y,i=0,j=0,kol_proh=0,b_per=0,c_per=0;
kol_proh=(n+(kol_v_gruppah*2)-1)/(kol_v_gruppah*2);
cout<<OEM("Слияние ")<<'\n';
cout<<OEM("Количество проходов ")<<kol_proh<<'\n';
cout<<OEM("Количество в группах ")<<kol_v_gruppah<<'\n';
for(i=0;i<kol_proh;i++)
{
b_per=0;c_per=0;
while((b_per<kol_v_gruppah)&&(c_per<kol_v_gruppah))
{
if(!fread(&y,sizeof(int) ,1,c))
{ c_per=kol_v_gruppah;
break;
}
fread(&x,sizeof(int),1,b);
if(x>=y)
{
fwrite(&y,sizeof(int) ,1,ish);
fseek(b,sizeof(int)*(-1),SEEK_CUR);
c_per++;
}
else
{
fwrite(&x,sizeof(int),1,ish);
fseek(c,sizeof(int)*(-1),SEEK_CUR);
b_per++;
}
}
while(b_per!=kol_v_gruppah)
{
if(fread(&y,sizeof(int) ,1,b))
fwrite(&y,sizeof(int) ,1,ish);
b_per++;
}
while(c_per!=kol_v_gruppah)
{
if(fread(&x,sizeof(int) ,1,c))
fwrite(&x,sizeof(int) ,1,ish);
c_per++;
}
}
}
//******************************************
void dvufaznaya()
{
FILE *a,*b,*c;
int l=1;
while (l<n)
{
a=fopen("File.txt","rb");
b=fopen("File1.txt","wb");
c=fopen("File2.txt","wb");
razbienie(a,b,c,l);
fclose (a); fclose (b); fclose (c);
b=fopen("File1.txt","rb");
c=fopen("File2.txt","rb");
// fseek(a,0,0);
//cout<<"a: ";File_vivod(a);
cout<<'\n';
cout<<"b: ";File_vivod(b);
cout<<"c: ";File_vivod(c);
fclose (a);
a=fopen("File.txt","wb");
fseek(b,0,0);
fseek(c,0,0);
sliyanie(a,b,c,l);
fclose (a);
a=fopen("File.txt","rb");
cout<<"a: ";File_vivod(a);
fclose (b);
fclose (c);
fclose (a);
l=l*2;
cout<<'\n';
}
}