C语言对磁盘文件进行快速排序简单实例
C语言对磁盘文件进行快速排序简单实例
快速排序(quicksort)是由C.A.R.Hoare发明并命名的,这种排序被认为是目前最好的一种排序算法。快速排序基于交换排序,与同样的基于交换排序的冒泡排序法相比,其效果非常明显。
它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
本例中快速排序是通过函数quick_disk(FILE*fp,intcount)中反复调用排序函数qs_disk(FILE*fp,intleft,intright)实现快速排序。在qs_disk()中,通过函数get_name(fp,(long)(i+j)/2)返回中间值作为比较数进行快速排序。
下面是具体的源代码:
#include#include #include #defineNUM4 structdata { charname[20]; charschool[20]; charcity[20]; charprovince[20]; }info; structdataaddrs[NUM]= { "OKBase","BIT","JiLin","JiLin", "TongWei","BIT","ZhengJiang","JiangSu", "SunYou","BIT","WeiFang","ShangDong", "XiaoMing","PKU","TaiYuan","ShanXi" }; /*对后面要用到的函数进行声明*/ voidquick_disk(FILE*fp,intcount); voidqs_disk(FILE*fp,intleft,intright); voidexchangedata(FILE*fp,longi,longj); char*get_name(FILE*fp,longrec); voidprint_data(structdata*p); structdata*get_data(FILE*fp,longrec); intmain(void) { inti; FILE*fp;/*文件指针*/ /*以读写方式生成文本文件fp*/ if((fp=fopen("datalist.txt","w+"))==NULL) { printf("打开文件失败\n"); exit(1); } printf("将未排序的数据写入文件\n"); /*将数组Sdata[NUM]写入文件中*/ fwrite(addrs,sizeof(addrs),1,fp); /*将文件中的数组Sdata[NUM]依次取出并打印*/ for(i=0;i 0)&&(j>left)) j--; if(i<=j) { exchangedata(fp,i,j);/*交换i和j对应的数据*/ i++; j--; } }while(i name;/*返回该结构体变量的name成员变量*/ } /*得到文件fp中变量rec对应的结构体变量的指针*/ structdata*get_data(FILE*fp,longrec) { structdata*p; p=&info; rewind(fp); /*找到该结构体变量得的位置*/ fseek(fp,rec*sizeof(info),SEEK_SET); /*将其读到指针p*/ fread(p,sizeof(info),1,fp); returnp;/*返回该结构体指针*/ } /*将指针p对应的结构体的各个成员变量打印出来*/ voidprint_data(structdata*p) { printf("姓名:%s\n",p->name); printf("学校:%s\n",p->school); printf("城市:%s\n",p->city); printf("省:%s\n",p->province); }
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!