Advertisement
jusohatam

Untitled

Mar 30th, 2021
419
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.31 KB | None | 0 0
  1. void Natural_Merging_Sort(char* name)
  2. {
  3.     int s1, s2, a1, a2, mark;
  4.     FILE *f, *f1, *f2;
  5.     s1 = s2 = 1;
  6.     while (s1 > 0 && s2 > 0) {
  7.         mark = 1;
  8.         s1 = 0;
  9.         s2 = 0;
  10.         f = fopen(name, "r");
  11.         f1 = fopen("nmsort_1", "w");
  12.         f2 = fopen("nmsort_2", "w");
  13.         fscanf(f, "%d", &a1);
  14.         if (!feof(f)) {
  15.             fprintf(f1, "%d ", a1);
  16.         }
  17.         if (!feof(f))
  18.             fscanf(f, "%d", &a2);
  19.         while (!feof(f)) {
  20.             if (a2 < a1) {
  21.                 switch (mark) {
  22.                 case 1: {
  23.                     fprintf(f1, "' ");
  24.                     mark = 2;
  25.                     s1++;
  26.                     break;
  27.                 }
  28.                 case 2: {
  29.                     fprintf(f2, "' ");
  30.                     mark = 1;
  31.                     s2++;
  32.                     break;
  33.                 }
  34.                 }
  35.             }
  36.             if (mark == 1) {
  37.                 fprintf(f1, "%d ", a2);
  38.                 s1++;
  39.             }
  40.             else {
  41.                 fprintf(f2, "%d ", a2);
  42.                 s2++;
  43.             }
  44.             a1 = a2;
  45.             fscanf(f, "%d", &a2);
  46.         }
  47.         if (s2 > 0 && mark == 2) {
  48.             fprintf(f2, "'");
  49.         }
  50.         if (s1 > 0 && mark == 1) {
  51.             fprintf(f1, "'");
  52.         }
  53.         fclose(f2);
  54.         fclose(f1);
  55.         fclose(f);
  56.  
  57.         cout << endl;
  58.         Print_File(name);
  59.         Print_File("nmsort_1");
  60.         Print_File("nmsort_2");
  61.         cout << endl;
  62.  
  63.         f = fopen(name, "w");
  64.         f1 = fopen("nmsort_1", "r");
  65.         f2 = fopen("nmsort_2", "r");
  66.         if (!feof(f1))
  67.             fscanf(f1, "%d", &a1);
  68.         if (!feof(f2))
  69.             fscanf(f2, "%d", &a2);
  70.         bool file1, file2;
  71.         while (!feof(f1) && !feof(f2)) {
  72.             file1 = file2 = false;
  73.             while (!file1 && !file2) {
  74.                 if (a1 <= a2) {
  75.                     fprintf(f, "%d ", a1);
  76.                     file1 = End_Range(f1);
  77.                     fscanf(f1, "%d", &a1);
  78.                 }
  79.                 else {
  80.                     fprintf(f, "%d ", a2);
  81.                     file2 = End_Range(f2);
  82.                     fscanf(f2, "%d", &a2);
  83.                 }
  84.             }
  85.             while (!file1) {
  86.                 fprintf(f, "%d ", a1);
  87.                 file1 = End_Range(f1);
  88.                 fscanf(f1, "%d", &a1);
  89.             }
  90.             while (!file2) {
  91.                 fprintf(f, "%d ", a2);
  92.                 file2 = End_Range(f2);
  93.                 fscanf(f2, "%d", &a2);
  94.             }
  95.         }
  96.         file1 = file2 = false;
  97.         while (!file1 && !feof(f1)) {
  98.             fprintf(f, "%d ", a1);
  99.             file1 = End_Range(f1);
  100.             fscanf(f1, "%d", &a1);
  101.         }
  102.         while (!file2 && !feof(f2)) {
  103.             fprintf(f, "%d ", a2);
  104.             file2 = End_Range(f2);
  105.             fscanf(f2, "%d", &a2);
  106.         }
  107.         fclose(f2);
  108.         fclose(f1);
  109.         fclose(f);
  110.     }
  111.     remove("nmsort_1");
  112.     remove("nmsort_2");
  113. }
  114. //определение конца блока
  115. bool End_Range(FILE* f)
  116. {
  117.     int tmp;
  118.     tmp = fgetc(f);
  119.     tmp = fgetc(f);
  120.     if (tmp != '\'')
  121.         fseek(f, -2, 1);
  122.     else
  123.         fseek(f, 1, 1);
  124.     return tmp == '\'' ? true : false;
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement