C語言對磁盤檔案進行快速排序簡單執行個體
快速排序(quick sort)是由C.A.R.Hoare發明并命名的,這種排序被認為是目前最好的一種排序算法。快速排序基于交換排序,與同樣的基于交換排序的冒泡排序法相比,其效果非常明顯。
它的基本思想是:通過一趟排序将要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分别進行快速排序,整個排序過程可以遞歸進行,以此達到整個資料變成有序序列。
本例中快速排序是通過函數quick_disk(FILE* fp,int count)中反複調用排序函數qs_disk(FILE* fp,int left,int right)實作快速排序。在qs_disk()中,通過函數get_name(fp,(long)(i+j)/2)傳回中間值作為比較數進行快速排序。
下面是具體的源代碼:
#include #include #include #define NUM 4
struct data
{
char name[20];
char school[20];
char city[20];
char province[20];
}info;
struct data addrs[NUM]=
{
"OKBase","BIT","JiLin","JiLin",
"TongWei","BIT","ZhengJiang","JiangSu",
"SunYou","BIT","WeiFang","ShangDong",
"XiaoMing","PKU","TaiYuan","ShanXi"
};
void quick_disk(FILE *fp,int count);
void qs_disk(FILE *fp,int left,int right);
void exchangedata(FILE *fp,long i, long j);
char *get_name(FILE *fp, long rec);
void print_data(struct data *p);
struct data *get_data(FILE *fp,long rec);
int main(void)
{
int i;
FILE *fp;
if((fp = fopen("datalist.txt","w+")) == NULL)
{
printf("打開檔案失敗\n");
exit(1);
}
printf("将未排序的資料寫入檔案\n");
fwrite(addrs,sizeof(addrs),1,fp);
for(i=0;i0)&&(j>left))
j--;
if(i<=j)
{
exchangedata(fp,i,j);
i++;
j--;
}
}while(iname;
}
struct data *get_data(FILE *fp,long rec)
{
struct data *p;
p = &info;
rewind(fp);
fseek(fp,rec*sizeof(info),SEEK_SET);
fread(p,sizeof(info),1,fp);
return p;
}
void print_data(struct data *p)
{
printf("姓名:%s\n",p->name);
printf("學校:%s\n",p->school);
printf("城市:%s\n",p->city);
printf("省 :%s\n",p->province);
}
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支援!