⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 11_3.c

📁 C语言常用算法源代码,非常好用非常好用
💻 C
字号:
/* ======================================== */
/*    程式实例: 11_3.c                      */
/*    直接合并排序                          */
/* ======================================== */
#include <stdio.h>
#define LEN  8                    /* 最大元素个数         */

/* ---------------------------------------- */
/*  直接合并排序                            */
/* ---------------------------------------- */
void merge_sort(FILE *merge,FILE *sort1,FILE *sort2,int len)
{
   int s1,s2;                     /* 资料计数             */
   int i,j,k;
   char c,c1,c2;

   for ( i = 1; i < len; i *= 2 )
   {
      /* 分割档案 */
      for ( j = 0; j < len / 2; j++ ) /* 分到档案一       */
      {
         c = getc(merge);
         putc(c,sort1);
      }
      for ( ; j < len; j++ )      /* 分到档案二           */
      {
         c = getc(merge);
         putc(c,sort2);
      }
      rewind(merge);              /* 重设档案指标         */
      rewind(sort1);
      rewind(sort2);
      for ( k = 0; k < len / 2; k += i )  /* 合并回路     */
      {
         c1 = getc(sort1);        /* 读取第一分割档       */
         c2 = getc(sort2);        /* 读取第二分割档       */
         s1 = s2 = 0;             /* 设定计数初值         */
         while ( 1 )
         {
            if ( c1 < c2 )        /* 比较两个值           */
            {
               /* 第一分割档小, 存入主档 */
               putc(c1,merge);
               s1++;              /* 计数加一             */
               if ( s1 < i )      /* 是否未读完           */
                  c1 = getc(sort1);   /* 读取第一分割档   */
               else
                  break;          /* 跳出回路             */
            }
            else
            {
               /* 第二分割档小, 存入主档 */
               putc(c2,merge);
               s2++;              /* 计数加一             */
               if ( s2 < i )      /* 是否未读完           */
                  c2 = getc(sort2);   /* 读取第一分割档   */
               else
                  break;          /* 跳出回路             */
            }
         }
         /* 第一分割档是否是最後一笔 */
         if ( s1 < i )            /* 处理最後一笔         */
         {
            putc(c1,merge);       /* 存入主档             */
            s1++;                 /* 计数加一             */
         }
         /* 第二分割档是否是最後一笔 */
         if ( s2 < i )            /* 处理最後一笔         */
         {
            putc(c2,merge);       /* 存入主档             */
            s2++;                 /* 计数加一             */
         }
         /* 第一分割档 */
         while ( s1 < i )         /* 取出剩下的资料       */
         {
            c = getc(sort1);      /* 读取第一分割档       */
            putc(c,merge);        /* 存入主档             */
            s1++;                 /* 计数加一             */
         }
         /* 第二分割档 */
         while ( s2 < i )         /* 取出剩下的资料       */
         {
            c = getc(sort2);      /* 读取第二分割档       */
            putc(c,merge);        /* 存入主档             */
            s2++;                 /* 计数加一             */
         }
      }
      rewind(merge);              /* 重设档案指标         */
      rewind(sort1);
      rewind(sort2);
   }
}

/* ---------------------------------------- */
/*  主程式: 读取两个档案内容, 接着用直接合  */
/*  并排序法来排序.                         */
/* ---------------------------------------- */
void main()
{
   FILE *data;                    /* 资料档               */
   FILE *fp;                      /* 主档指标             */
   FILE *fp1;                     /* 第一分割档案指标     */
   FILE *fp2;                     /* 第二分割档案指标     */
   char c;
   int j;

   data = fopen("data.txt","r");  /* 开启资料档           */
   if ( data == NULL )
   {
      printf("资料档档开启错误! \n");
      exit(0);                    /* 离开                 */
   }
   fp = fopen("result.txt","r+"); /* 开启主档             */
   if ( fp == NULL )
      printf("主档开启错误! \n");
   else
   {
      for ( j = 0; j < LEN; j++ ) /* 拷贝资料到主档       */
      {
         c = getc(data);          /* 读取资料             */
         putc(c,fp);              /* 存入资料             */
      }
      fclose(data);               /* 关资料档             */
      rewind(fp);                 /* 重设档案指标         */
      fp1 = fopen("split1.txt","r+"); /* 开启第一分割档案 */
      if ( fp1 == NULL )
         printf("第一分割档开启错误! \n");
      else
      {
         fp2 = fopen("split2.txt","r+"); /*开启第二分割档案*/
         if ( fp2 == NULL )
            printf("第二分割档开启错误! \n");
         else
         {
            printf("正在处理数据,请稍等. . . \n");
            merge_sort(fp,fp1,fp2,LEN);  /* 直接合并排序法 */
            printf("数据处理完成! \n");
            fclose(fp);                  /* 关档           */
            fclose(fp1);
            fclose(fp2);
         }
      }
   }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -