11_4.C
上传用户:wyn840322
上传日期:2007-01-13
资源大小:294k
文件大小:4k
源码类别:

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程式实例: 11_4.c                      */
  3. /*    随机存取档案的快速排序法              */
  4. /* ======================================== */
  5. #include <stdio.h>
  6. #define MAX  8                    /* 最大档案长度     */
  7. #define LEN  sizeof(char)         /* 字元长度         */
  8. /* ---------------------------------------- */
  9. /*  档案读取字元                            */
  10. /* ---------------------------------------- */
  11. char get_char(FILE *fp,long int pos)
  12. {
  13.    char c;
  14.    fseek(fp,LEN*pos,0);           /* 档案中找字元     */
  15.    fread(&c,LEN,1,fp);            /* 从档案中取字元   */
  16.    return c;                      /* 传回字元         */
  17. }
  18. /* ---------------------------------------- */
  19. /*  档案字元交换                            */
  20. /* ---------------------------------------- */
  21. void swap_char(FILE *fp,long int pos1,long int pos2)
  22. {
  23.    char c1,c2;
  24.    fseek(fp,LEN*pos1,0);          /* 找第一个元素     */
  25.    fread(&c1,LEN,1,fp);           /* 取第一个元素     */
  26.    fseek(fp,LEN*pos2,0);          /* 找第二个元素     */
  27.    fread(&c2,LEN,1,fp);           /* 取第二个元素     */
  28.    fseek(fp,LEN*pos1,0);          /* 找第一个元素     */
  29.    fwrite(&c2,LEN,1,fp);          /* 存第二个元素     */
  30.    fseek(fp,LEN*pos2,0);          /* 找第二个元素     */
  31.    fwrite(&c1,LEN,1,fp);          /* 存第一个元素     */
  32. }
  33. /* ---------------------------------------- */
  34. /*  快速排序法的递回处理                    */
  35. /* ---------------------------------------- */
  36. void q_sort(FILE *fp,long int left,long int right)
  37. {
  38.    char partition;                /* 分割元素         */
  39.    int i,j;
  40.    if ( left < right )            /* 是否继续分割     */
  41.    {
  42.       i = left;                   /* 分割的最左       */
  43.       j = right + 1;              /* 分割的最右       */
  44.       partition = get_char(fp,left);  /* 取第一个元素 */
  45.       do {
  46.          do {                     /* 从左往右找       */
  47.             i++;
  48.          } while( get_char(fp,i) < partition );
  49.          do {                     /* 从右往左找       */
  50.             j--;
  51.          } while( get_char(fp,j) > partition );
  52.          if ( i < j )
  53.             swap_char(fp,i,j);    /* 交换资料         */
  54.       } while( i < j );
  55.       swap_char(fp,j,left);       /* 交换资料         */
  56.       q_sort(fp,left,j-1);        /* 快速排序递回呼叫 */
  57.       q_sort(fp,j+1,right);       /* 快速排序递回呼叫 */
  58.    }
  59. }
  60. /* ---------------------------------------- */
  61. /*  快速排序法                              */
  62. /* ---------------------------------------- */
  63. void quick(FILE *fp,int n)
  64. {
  65.    q_sort(fp,0l,( long )n-1);
  66. }
  67. /* ---------------------------------------- */
  68. /*  主程式: 将档案data.txt的资料用快速排序  */
  69. /*  法排序, 然後将结果存入档案result.txt    */
  70. /* ---------------------------------------- */
  71. void main()
  72. {
  73.    FILE *data;                    /* 资料档           */
  74.    FILE *fp;                      /* 主档指标         */
  75.    char c;
  76.    int j;
  77.    data = fopen("data.txt","r");  /* 开启资料档       */
  78.    if ( data == NULL )
  79.    {
  80.       printf("资料档档开启错误! n");
  81.       exit(0);                    /* 离开             */
  82.    }
  83.    fp = fopen("result.txt","r+"); /* 开启主档         */
  84.    if ( fp == NULL )
  85.       printf("主档开启错误! n");
  86.    else
  87.    {
  88.       for ( j = 0; j < MAX; j++ ) /* 拷贝资料到主档   */
  89.       {
  90.          c = getc(data);          /* 读取资料         */
  91.          putc(c,fp);              /* 存入资料         */
  92.       }
  93.       fclose(data);               /* 关资料档         */
  94.       rewind(fp);                 /* 重设档案指标     */
  95.       printf("正在处理数据,请稍等. . . n");
  96.       quick(fp,MAX);              /* 档案的快速排序法 */
  97.       printf("数据处理完成! n");
  98.       fclose(fp);                 /* 关档             */
  99.    }
  100. }