Сложность печати каждой итерации алгоритма сортировки транспозиции

#c #sorting #printf

#c #сортировка #printf

Вопрос:

Я следую «C путем разбиения», поскольку я новичок, и я пытаюсь распечатать каждую итерацию алгоритма сортировки транспозиции с ожидаемым результатом:

    Unordered: 7 3 66 3 -5 22 -77 2
After pass 1: -77 7 66 3 3 22 -5 2    
After pass 2: -77 -5 66 7 3 22 3 2    
...    
     Ordered: -77 -5 2 3 3 7 22 66  
  

Однако я могу дойти только до распечатки:

    Unordered: 7 3 66 3 -5 22 -77 2
After pass 1:
After pass 2:
...
     Ordered: -77 -5 2 3 3 7 22 66
  

И, таким образом, я упускаю основную суть упражнения. Я попытался разместить printf(«%d», a[i]); во многих местах, но это не дает желаемого результата, поэтому любая помощь будет оценена.

 #include <stdio.h>

void swap (int *p, int *q);
void transposition (int a[], int n);

#define SIZE 8

int main (void)
{
   int arr[SIZE] = {7, 3, 66, 3, -5, 22, -77, 2};
   int i;

   printf("   Unordered: ");
   for (i = 0; i < SIZE; i  ) {
      printf("%d ", arr[i]);
   }

   transposition(arr, SIZE);


   printf("n     Ordered: ");
   for (i = 0; i < SIZE; i  ) {
      printf("%d ", arr[i]);
   }
   printf("n");

   return 0;
}

void swap (int *p, int *q)
{
   int tmp;

   tmp = *p;
   *p = *q;
   *q = tmp;
}

void transposition (int a[], int n)
{
   int i, j;

   for (i = 0; i < n; i  ) {
      for (j = i   1; j < n; j  ) {
         if (a[i] > a[j]) {
            swap(amp;a[i], amp;a[j]);
         }
      }
      printf("nAfter pass %d: ", i);

   }
}
  

Комментарии:

1. Я рекомендую вызывать вашу функцию сортировки sort или sort_by_transposition или transposition_sort , а не просто transposition ; название transposition звучит так, как будто функция применяет одну транспозицию, тогда как на самом деле она сортирует массив, применяя до n ^ 2 транспозиций.

Ответ №1:

Чтобы распечатать последовательность, вы должны добавить операторы в последовательность печати.

 void transposition (int a[], int n)
{
   int i, j;

   for (i = 0; i < n; i  ) {
      for (j = i   1; j < n; j  ) {
         if (a[i] > a[j]) {
            swap(amp;a[i], amp;a[j]);
         }
      }
      printf("nAfter pass %d: ", i);

      /* add this */
      for (j = 0; j < n; j  ) {
         printf("%d ", a[j]);
      }

   }
}
  

Указывает на изменение кода в main()

    for (i = 0; i < SIZE; i  ) {
      printf("%d ", arr[i]);
   }
  

являются:

  • i j i Во внешнем цикле используется изменение на because .
  • Изменить arr на a в соответствии с аргументом.
  • Изменить SIZE на n в соответствии с аргументом.

Комментарии:

1. В этом ответе рекомендуется копировать for (j = 0; j < n; j ) { printf("%d ", a[j]); } каждое место, где требуется печать массива. Но не было бы намного лучше перенести этот код в функцию print_array ?

2. @Stef Вы можете написать ответ, предполагающий это.

3. Кроме того, вы забыли printf("n"); .

4. @Stef Я этого не делал. Новая строка находится в printf("nAfter pass %d: ", i);

Ответ №2:

Избегайте дублирования кода, инкапсулируя полезный код в функцию

Поскольку печать массива — это то, что вам нужно делать более одного раза, вы должны написать функцию, которая это делает:

 void print_array(int arr[], int n, char const *title)
{
   printf("n     %s: ", title);
   for (i = 0; i < SIZE; i  ) {
      printf("%d ", arr[i]);
   }
   printf("n");
}
  

Используя нашу функцию print_array

Затем вы можете вызывать эту функцию всякий раз, когда захотите распечатать массив:

  • Один раз перед сортировкой под названием «Неупорядоченный»;
  • Один раз после сортировки заголовок «Упорядоченный»;
  • На каждой итерации for циклов — с заголовком, указывающим значение i .
 #include <stdio.h>

void swap (int *p, int *q);
void sort_by_transpositions (int a[], int n);
void print_array (int a[], int n, char const *title);

#define SIZE 8

int main (void)
{
   int arr[SIZE] = {7, 3, 66, 3, -5, 22, -77, 2};
   int i;

   print_array(arr, SIZE, "Unordered");

   sort_by_transpositions(arr, SIZE);

   print_array(arr, SIZE, "Ordered");

   return 0;
}

void swap (int *p, int *q)
{
   int tmp;

   tmp = *p;
   *p = *q;
   *q = tmp;
}

# define BUFFERSIZE 100

void sort_by_transpositions (int a[], int n)
{
   int i, j;
   char after_pass_i_title[BUFFERSIZE];

   for (i = 0; i < n; i  ) {
      for (j = i   1; j < n; j  ) {
         if (a[i] > a[j]) {
            swap(amp;a[i], amp;a[j]);
         }
      }
      snprintf(after_pass_i_title, BUFFERSIZE, "After pass %d", i);
      print_array(a, n, after_pass_i_title);
   }
}
  

Обратите внимание на использование функции snprintf из заголовка stdio.h , которая похожа на printf , но печатает в строку вместо печати в стандартный вывод.

Позволяет пользователю выбирать, хочет ли он, чтобы сортировка была тихой или подробной

Возможно, пользователь хочет отсортировать массив, но не хочет получать тонны строк вывода в результате сортировки. Вы можете добавить параметр в свою функцию сортировки, указав, следует ли выполнять всю печать:

 void sort_by_transpositions (int a[], int n, int verbose)
{
   int i, j;
   char after_pass_i_title[BUFFERSIZE];

   if (verbose)
      print_array(arr, SIZE, "Unordered");

   for (i = 0; i < n; i  )
   {
      for (j = i   1; j < n; j  )
      {
         if (a[i] > a[j])
         {
            swap(amp;a[i], amp;a[j]);
         }
      }
      if (verbose)
      {
          snprintf(after_pass_i_title, BUFFERSIZE, "After pass %d", i);
          print_array(a, n, after_pass_i_title);
      }
   }

   if (verbose)
      print_array(arr, SIZE, "Ordered");
}
  

Затем вы можете вызвать свою функцию из main и указать verbose ( 1 ) или not verbose ( 0 ):

 # define VERBOSE 1
# define SILENT  0

int main (void)
{
   int arr[SIZE] = {7, 3, 66, 3, -5, 22, -77, 2};
   int i;

   sort_by_transpositions(arr, SIZE, VERBOSE);

   return 0;
}
  

Обратите внимание, что я переместил все вызовы print_array во внутреннюю функцию sort_by_transpositions вместо того, чтобы иметь некоторые вызовы внутри sort_by_transpositions и некоторые другие внутри main . Проще, если все операторы печати расположены внутри одной и той же функции, а не разбросаны повсюду.