Сортировка вставками (не работает) - C (СИ)
Формулировка задачи:
Программа генерирует массив в фаил и сортирует его методом вставок. Но сама сортировка не происходит
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 100
int main(void)
{
srand(time(NULL));
FILE *file;
int i, j=0, step=0, tmp=N;
int *A=(int*)malloc(sizeof(int)*N);
int mas[N];
printf("Array:\n");
for(i=0; i<N; ++i)
{
mas[i] = rand() %(100-(-100)+1)+(-100);
printf("%d ", mas[i]);
}
puts("");
if((file = fopen("C://out.dat","wb+"))==NULL)
printf( "The file was not opened\n" );
else
{
fwrite(&tmp,sizeof(int),1,file);
fwrite(mas,sizeof(int),N,file);//òåïåðü Гў ГґГ*éëå Г*Г*Гё Г¬Г*Г±Г±ГЁГў(ГЎГЁГ*Г*Г°Г*ûé)
rewind(file);
fread(&step, sizeof(int), 1, file);
fread(A, sizeof(int), step, file);
for(i = 1; i < N; i++)
{
tmp = A[i];
for(j = i; j>=step; j-=step)
{
tmp=A[i];
for(j=i-1; j>=0 && A[j]>tmp; j--)A[j+1]=A[j];
A[j+1] = tmp;
}
}
printf("Sorted array:\n");
for (i = 0; i < 100; i++)
{
printf("%d ", A[i]);
}
}
fclose(file);
return 0;
}Решение задачи: «Сортировка вставками (не работает)»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
int GetInt(FILE *f, int p)
{
int r;
fseek(f,(p*4),SEEK_SET);
fread(&r,sizeof(r),1,f);
return r;
}
void PutInt(FILE *f, int p, int v)
{
fseek(f,(p*4),SEEK_SET);
fwrite(&v,sizeof(v),1,f);
}
int iSort(char *fname, int N)
{
FILE *f;
int i,j,x,y,k;
f=fopen(fname,"rb+");
if (f==NULL) return 1;
for (i=1; i<N; i++)
{
x=GetInt(f,i);
for (j=i-1; j>=0; j--)
{
y=GetInt(f,j);
if (x<y)
{
PutInt(f,(j+1),y);
k=j;
}
else
{
k=j+1;
break;
}
}
if (k>=0) PutInt(f,k,x);
}
fclose(f);
return 0;
}
void PrintFile(char *fname)
{
FILE *f;
int i,r,fsize;
f=fopen(fname,"r");
if (f==NULL) return;
fseek(f,0,SEEK_END);
fsize=ftell(f);
i=0;
while (1)
{
if (i*4>=fsize) break;
r=GetInt(f,i);
printf("%d ",r);
i++;
}
fclose(f);
printf("\n\n");
}
int main(int argc, char *argv[])
{
FILE *f;
char *fname="f.dat";
int A[10]={3,-7,12,1,3,3,6,7,98,-55};
int i;
f=fopen(fname,"w");
if (f==NULL) return 1;
for (i=0; i<10; i++) PutInt(f,i,A[i]);
fclose(f);
PrintFile(fname);
iSort(fname,10);
PrintFile(fname);
system("PAUSE");
return 0;
}