|
안녕하세요 구조체를 이용하여 전화번호부 구조체를 만들어
이름/전화번호/주소 이 필드를 사용해 이진파일로 저장을했습니다.
그런데 데이타가 10만개를 무작위로 저장해서 지금사용하는
정렬을 써보니 무진장 느립니다..심지어는
컴퓨터가 다운이 되버립니다.
데이타가 10만개이상에서 유용히 사용할만한 소트알고리즘은
없는것인지요?
DB를 사용한게 아니라 그냥 씨 파일관련함수로 작성된
DB입니다.
아래는 사용한소스입니다.
void TMainForm::DiskSwap(long int i,long int j)
{
struct DBTYPE db1,db2;
FILE *fp;
fp=fopen(FileName,"r+b");
fseek(fp,sizeof(struct DBTYPE)*i,SEEK_SET);
fread(&db1,sizeof(struct DBTYPE),1,fp);
fseek(fp,sizeof(struct DBTYPE)*j,SEEK_SET);
fread(&db2,sizeof(struct DBTYPE),1,fp);
fseek(fp,sizeof(struct DBTYPE)*i,SEEK_SET);
fwrite(&db2,sizeof(struct DBTYPE),1,fp);
fseek(fp,sizeof(struct DBTYPE)*j,SEEK_SET);
fwrite(&db1,sizeof(struct DBTYPE),1,fp);
fclose(fp);
}
//---------------------------------------------------------------------------
int TMainForm::DiskComp(long int i,long int j)
{
struct DBTYPE db1,db2;
FILE *fp;
fseek(fp,sizeof(struct DBTYPE)*i,SEEK_SET);
fread(&db1,sizeof(struct DBTYPE),1,fp);
fseek(fp,sizeof(struct DBTYPE)*j,SEEK_SET);
fread(&db2,sizeof(struct DBTYPE),1,fp);
fclose(fp);
return strcmp(Dataenc(db1.Name),Dataenc(db2.Name));
}
//---------------------------------------------------------------------------
void TMainForm::NameSort(long int left,long int right)
{
long int i,last;
if(left >= right) return;
DiskSwap(left,(left+right)/2);
last=left;
for(i=left+1;i<=right;i++)
if(DiskComp(i,left)<0)
DiskSwap(++last,i);
DiskSwap(left,last);
NameSort(left,last-1);
NameSort(last+1,right);
}
//---------------------------------------------------------------------------
위의 코딩으로 작업을 하였습니다.
도스 C 책에 있던 코드를 사용한것인데
겁나게 느려요
겁나게 빠른 정렬좀 알려주세요 제발...
10만개 데이타도 거뜬히 정렬해서 저장할수 있는 그런 정렬소스좀...
|