Перестановка элементов массива - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Ребят, помогите, делаю курсовую по быстрой сортировке, уже неделю парюсь с перестановками! Искал ранние темы, спрашивал у других, никто ничего путного не может сказать. Дело в том, что если ввести массив 0 1, т.е. упорядоченный, также насчитывает одну перестановку, как и при 1 0. Соответственно, при более больших массивах, тоже явно лишние перестановки считает. Не знаю уже, как этот счетчик правильно использовать, пытался сделать зависимым от изменения переменной vrem... тоже самое. Вот привожу саму функцию, на переменную choose не обращайте внимания, это для отображения пошаговой сортировки. Заранее спасибо!
void quicksort(float* M, int choose, int begin, int end)
    {
                      
          float k, vrem;
          int b, e, h;
          
          b = begin;
          e = end;
          
          k = M[(b+e)/2];

          do
          {
              sravn++;
              while(M[b] < k) 
              {
                         sravn++;
                         b++;
              }
              
              sravn++;
              while(M[e] > k)
              {
                         sravn++;
                         e--;
              }
              
              if(choose == 1)
                    {
                                                  printf("\n");
                              for(h=0; h<atoi(kol); h++)
                              {
                                                    printf(" %.0f", M[h]);
                                                  }
                                        } else continue;
              
              if (b <= e)
              {
                    vrem = M[b];
                    M[b] = M[e];
                    M[e] = vrem;
                    count++;
                    b++;  
                    e--;
              }
              
          } while(b <= e);
          
             if(e > begin) quicksort(M, choose, begin, e); 
             if(b < end)   quicksort(M, choose, b, end);
                  
    }

Решение задачи: «Перестановка элементов массива»

textual
Листинг программы
#include <stdio.h>
 
int count,sravn;
 
void quicksort(float* M, int choose, int begin, int end)
    {
      float k, vrem;
      int b, e, h;
      b = begin;
      e = end;
      k = M[(b+e)/2];
      do
      {
          sravn++;
          while(M[b] < k) 
          {
            sravn++;
            b++;
          }
          sravn++;
          while(M[e] > k)
          {
              sravn++;
              e--;
          }
              
          //if(choose == 1)
          //{
          //  printf("\n");
          //  for(h=0; h<atoi(kol); h++)
          //  {
          //      printf(" %.0f", M[h]);
          //  }
          //} else continue;
              
          if (b <= e)
           {
             if (b != e)  /* !!!!!!! */
             {
              vrem = M[b];
              M[b] = M[e];
              M[e] = vrem;
              count++;
             }
             b++;  
             e--;
           }
              
      } while(b <= e);
 
      if (e > begin) 
          quicksort(M, choose, begin, e); 
      if (b < end)   
          quicksort(M, choose, b, end);
                  
    }
 
int main(int argc, char* argv[])
{
    float Arr[7]={1,2,3,4,5,6,7};
    int i;
 
    count=0;
    sravn=0;
 
    quicksort(Arr,0,0,6);
    
    for (i=0; i<7; i++) printf("%f ",Arr[i]);
    printf("\n %d \n ",count);
    return 0;
}

Объяснение кода листинга программы

Код реализует алгоритм быстрой сортировки (quicksort) для массива целых чисел. Список действий:

  1. Ввод данных: массив Arr размером 7, содержащий числа {1,2,3,4,5,6,7}, инициализируется внутри функции main.
  2. Инициализация переменных: count и sravn устанавливаются равными 0.
  3. Вызов функции quicksort с аргументами: M (указатель на массив), choose (выборка, всегда равна 0), begin (начальный индекс, всегда равен 0), end (конечный индекс, равен 6).
  4. Внутри функции quicksort происходит перестановка элементов массива с помощью следующих действий:
    • Определение среднего элемента массива (k) и его значения.
    • Поиск элементов, меньших или равных k, и их перестановка в начало массива.
    • Поиск элементов, больших k, и их перестановка в конец массива.
    • Если массив был разрезан на две части (больше и меньше k), рекурсивный вызов quicksort для каждой из частей.
    • Если массив был отсортирован (то есть, все элементы были переставлены), выводится количество перестановок (count).
  5. Вывод отсортированного массива и количества перестановок. Ответ:
    • В данном коде реализуется алгоритм быстрой сортировки (quicksort) для массива целых чисел.
    • Алгоритм работает путем определения среднего элемента массива и разбиения массива на две части: элементы, меньшие или равные среднему, и элементы, большие среднего. Затем каждая из этих частей сортируется отдельно.
    • Перестановка элементов массива выполняется путем обмена значениями элементов, пока массив не будет отсортирован.
    • В данном коде не реализован вывод отсортированного массива и количества перестановок. Однако, в функции main есть код, который выводит отсортированный массив и количество перестановок.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.154 из 5
Похожие ответы