Автор - fedorunchik

Необходимо написать программу, сортирующую случайный массив следующим способом:

метод является модификацией пузырьковой сортировки и состоит из двух этапов - подъема и спуска. При подъеме последовательно сравниваются соседние элементы a[i] и a[i+1] до тех пор, пока не будет сделана первая перестановка. Пусть эта перестановка затронула элементы a[k] и a[k+1] . Следующим этапом является спуск. Новый элемент a[k] сравниваются с a[k−1] и если a[k] < a[k−1] , то выполняется перестановка. Сравнение продолжается в нисходящем направлении (т.е. для a[k−1] и a[k−2] , a[k−2] и a[k−3] и т.д.) до тех пор, пока выполняются перестановки либо достигается начало массива.
После этого возобновляется подъем с позиции i = k+1. Таким образом,
сортировка состоит из сменяющих друг друга процессов подъема (до
первой перестановки) и спуска (до первого отсутствия перестановки) до тех пор, пока при подъеме не будет затронут последний элемент
массива a[n−1] (при этом спуск также должен быть выполнен).

Помогите, пожалуйста, написать именно в соответствии с этим условием, язык: питон / паскаль ABC, ну главное здесь - алгоритм нужен понятный. ВАЖНО: ДОЛЖНО БЫТЬ НЕ БОЛЕЕ 2 ЦИКЛОВ (не условных операторов, а именно циклов), неважно какой длины и каких, но НЕ БОЛЕЕ ДВУХ.

Ответ

Автор - BobbyFresnel

===== С++ 17 =====

#include <iostream>

using namespace std;

void swap(int &a, int &b)

{

   int t = a;

   a = b;

   b = t;

}

int main()

{

   int n;

   cin >> n;

   int a[n];

   srand(time(NULL));

   for(int i = 0; i < n; i++)

   {

       a[i] = rand() % 198 - 99;

       cout << a[i] << " ";

   }

   cout << endl;

   bool perm = false;

   int j;

   for(int i = 0; i < n - 1; i++)

   {

       if(a[i] > a[i + 1])

       {

           swap(a[i], a[i + 1]);

           j = i;

           perm = true;

           while(perm && (j > 0))

               if(a[j] < a[j - 1])

               {

                   perm = true;

                   swap(a[j], a[j - 1]);

                   j--;

               }

               else perm = false;

       }

   }

   for(int i = 0; i < n; i++)

       cout << a[i] << " ";

   cout << endl;

   return 0;

}

Ответы и объяснения

Сервис носит ознакомительный характер, вся информация, а в частности вопросы и ответы, которые задают и отвечают пользователи.
© 2026 Все права защищены Политика конфиденциальности Контакты
search points attachment profile arrow left arrow right star heart verified symbols equation arrow-down question mark check menu accountancyadministrationagriculturalalgebraallarabicartart_musicbelarusbelarus_altbiologybusinesscatalachemistrychineseeconomicsegzamenglishentrepreneurshipenvironmentethicseuskarafirst_aidfrenchgalegogeographygeologygeometrygermangrammarhealthhistoryindia_langindonesian_langinformaticsitalianjapanesekazachkazach_altkoreanlanguagelatinlawlife_scienceliteraturelogicmathematicsmusicnigerian_langother_languagesotherspedagogicsphilosophyphysical_educationphysicspoliticspsychologyreligionrpa_langrussianrussian_altsciencesecurityskillssocial_sciencesociologyspanishstatisticstechnologytourismtrafficukrainianukrainian_altukrainian_literaturewos_civilisation accountancyadministrationagriculturalalgebraall_1arabicartart_music_2belarusbelarus_altbiologybusiness_2catalachemistry_1chineseeconomicsexam_3englishentrepreneurshipenvironment_2ethicseuskarasecurity_1frenchgalegogeography_4geology_4geometrygermangrammarhealthhistoryindia-langindonesian-langinformaticsitalianjapanesekazachAsset 230koreanlanguagelatinlawlife-scienceliteraturelogic_2mathematicsmusicnigerian-langotherlanguagesother_1pedagogicsphilosophyphysical_educationphysicspoliticspsychologyreligion_1rpa-langrussianrussian_altsciencesecurity_3_mskills_1allsocial_science_5_msociologyspanishstatisticstechnologytourismtrafficukrainianukrainian_altukrainian_literaturewos_civilisation