Member 13612394 Ответов: 4

В чем проблема в этом коде ... могу ли я пройти этот путь


Я хочу написать программу wright для сортировки слиянием трех способов с использованием двух способов,с минимальной временной сложностью

Что я уже пробовал:

#include <stdio.h>
#define max 10

int a[11] = { 10, 14, 19, 26, 27, 31, 33, 35, 42, 44, 0 };
int b[10];

void merging(int low, int mid1,int mid2, int high) {
   int l1, l2,l3, i;

  for(l1 = low, l2 = mid1 + 1,l3=mid2+1,i = low; l1 <= mid1 && l2 <= mid2,l3<=high; i++)
      {
      if((a[l1] <= a[l2])&&(a[l1]<=a[l3]))
         b[i] = a[l1++];
      else if((a[l2]<=a[l1])&&(a[l2]<=a[l3]))
         b[i] = a[l2++];
        else b[i]=a[l3++];
   }
   
   while(l1 <= mid1)    
      b[i++] = a[l1++];

   while(l2 <= mid2)   
      b[i++] = a[l2++];
   
   while(l3<=high)
      b[i++]=a[l3++];

   for(i = low; i <= high; i++)
      a[i] = b[i];
}

void sort(int low, int high) {
   int mid1,mid2;
   
   if(low < high) {
      mid1 = (low + high) / 3;
      mid2=2*(low+high)/3;
      sort(low, mid1);
      sort(mid1+1,mid2);
      sort(mid2+1, high);
      merging(low, mid1,mid2, high);
   } else { 
      return;
   }   
}

int main() { 
   int i;

   printf("List before sorting\n");
   
   for(i = 0; i <= max; i++)
      printf("%d ", a[i]);

   sort(0, max);

   printf("\nList after sorting\n");
   
   for(i = 0; i <= max; i++)
      printf("%d ", a[i]);
}

4 Ответов

Рейтинг:
2

CPallini

Похоже вы модифицировали эту программу: Программа сортировки слиянием на языке Си[^]. Похоже также, что прямая модификация не работает. Я думаю merging функция испорчена. Возможно, вам следует изучить его алгоритм и исправить его.


Рейтинг:
1

Patrice T

int a[11] = { 10, 14, 19, 26, 27, 31, 33, 35, 42, 44, 0 };

Совет: никогда не начинайте с отсортированного массива в качестве входных данных.

Я боюсь, что ваш код не учитывает все детали "трехсторонней сортировки слиянием". Когда вы закончите с 1 из 3 подмассивов, как вы узнаете порядок или 2 оставшихся подмассива?

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что он делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Рейтинг:
0

OriginalGriff

Тогда у вас есть наше разрешение.
Но ... поскольку это ваша домашняя работа, вы должны делать ее сами, а не заставлять нас "исправлять ее" для вас.

Так что все будет зависеть от тебя.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Как вы его используете, зависит от вашей системы компилятора, но быстрый поиск в Google имени вашей IDE и "отладчика" должен дать вам необходимую информацию.

Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!


Рейтинг:
0

Jochen Arndt

Это потребует много времени, чтобы проверить ваш код на наличие ошибок и если он будет делать то, что должен.

Но есть одна очевидная ошибка:
Ваш b массив слишком мал, что приводит к переполнению буфера. Он должен иметь тот же размер 11 (max + 1) в качестве a массив.