Отсортировать числа в массиве лексикографически - C (СИ)

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

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

Есть числа. Пусть это числа 102 211 121 010(Все числа одного размера N. В данном примере N=3) В массиве они записаны следующим образом 1 0 2 2 1 1 1 2 1 0 1 0. Нужно их отсортировать лексикографически в этом массиве. (010 102 121 211) То есть записать так 0 1 0 1 0 2 1 2 1 2 1 1. Подайте идею как это можно сделать ?

Решение задачи: «Отсортировать числа в массиве лексикографически»

textual
Листинг программы
  1. #include <cstdio>
  2. using namespace std;
  3. void swap(int & a, int &b)
  4. {
  5.     int temp=a;
  6.     a=b;
  7.     b=temp;
  8. }
  9. void perest(int mas[],int & i,int & j,int n)
  10. {
  11.  
  12. for (int k=0;k<n;k++)
  13. swap(mas[k+i],mas[k+j]);
  14.  
  15. }
  16. int sravnenie (int mas[],int  i, int  j,int n)
  17. {
  18.     for (int k=0;k<n;k++)
  19.         {if (mas[i+k]<mas[j+k]) return 1;
  20.         else if (mas[i+k]>mas[j+k]) return 0;
  21.         }
  22.    
  23.         return 0;
  24. }
  25. void sort(int mas[],int nach,int  raz,int n)
  26. {
  27. int kolvo_chisel=(raz+n-nach)/n;
  28. int a=nach+(kolvo_chisel/2)*n;
  29. int i=nach,j=raz;
  30. do
  31. {
  32.    
  33.     while(sravnenie(mas,i,a,n )) i+=n;
  34. while (sravnenie(mas,a,j,n ) ) j-=n;
  35. if (i<=j)
  36. {
  37. if (i==a) a=j;
  38. else if(j==a) a=i;
  39. perest(mas,i,j,n);
  40. i+=n;j-=n;
  41. }
  42. }while(i<=j);
  43. if (i<raz) {sort(mas,i,raz,n);}
  44. if (j>nach) {sort (mas,nach,j,n);}
  45. }
  46. int main()
  47. {
  48. int a[]={1, 0 ,2 ,2, 1 ,1, 1 ,2 ,1 ,0 ,1 ,0};
  49. int n=3;
  50. sort(a,0,12-n,n);
  51. for (int i=0;i<12;i++)
  52. printf("%d ",a[i]);
  53. return 0;
  54. }

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

В данном коде реализована сортировка массива методом выборочного (сегментного) сортирования. Список действий, которые происходят в коде:

  1. Сравнение элементов массива и выбор опорного элемента
    • Функция sravnenie сравнивает элементы массива mas с индексами i и j и возвращает 1, если элемент с индексом i меньше, и 0 в противном случае. Это нужно для определения, в какую сторону необходимо «подровнять» массив при каждом проходе цикла.
  2. Перестановка элементов массива
    • Функция perest меняет местами элементы массива mas с индексами i и j.
  3. Основной цикл сортировки
    • Внешний цикл do организует проходы по массиву до тех пор, пока есть элементы, которые необходимо переставить.
    • Внутренний цикл while отслеживает границы, внутри которых необходимо искать элементы для перестановки.
    • Если текущий элемент меньше опорного, то цикл смещается вправо, иначе - влево.
    • Если границы пересеклись, то это означает, что опорный элемент был найден, и элементы с его индексами были переставлены местами.
  4. Рекурсивная сортировка
    • Если после прохода по массиву остались неотсортированные элементы, то сортировка повторяется рекурсивно для соответствующих диапазонов.
  5. Ввод-вывод данных
    • В функции main создаётся массив a с десятью элементами.
    • Массив сортируется с помощью функции sort.
    • Отсортированный массив выводится на экран с помощью цикла for и функции printf.

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


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

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

13   голосов , оценка 4.308 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы