Форум программистов, компьютерный форум, киберфорум
Sasha
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Упорядочивание массива методом Ларионова (Larionov Sort)

Запись от Sasha размещена 13.03.2014 в 15:49
Показов 3312 Комментарии 0

В 2004 г. четырнадцатилетний Матвей Ларионов на занятиях по изучению TurboPascal предложил свой оригинальный метод сортировки. Сущность преобразования исходного массива состоит в том, чтобы вначале расположить все нечётные элементы, а за ними - все чётные.
В этом методе при последовательном просмотре каждого элемента исходного массива mass с номером ij осуществляется подсчёт текущего числа ik нечётных элементов (он начинается с единицы). В начале просмотра ik=0. В ходе анализа элементов массива может возникнуть две ситуации:

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
 // Cортировка Ларионова
  int ik = 0; // Число нечётных элементов перед просмотром mass
     for(int ij = 0, iByf; ij < list->Count; ++ij) //iByf от Byfer
      {
        if(mass[ij]%2==1)//Если число нечётное
        {
         iByf = mass[ik];//Временное хранение чётного элемента
         mass[ik] = mass[ij];//Меняем местами текущий нечётный элемент
         mass[ij] = iByf;//с первым чётным
         ik++;//счётчик числа нечётных элементов
        }
      }
В этом примере я использовал такие компоненты как:

Edit1(InputMas)
Edit2(OutputMas)
Button1(Power)
Label1(In Mas) // для подписи к Edit1(InputMas)
Label2(Out Mas) // для подписи к Edit2(OutputMas)

В первый InputMas будем вводить через пробел числа для сортировки. При нажатии на Power числа в отсортированном виде будут выводиться в OutputMas.

Перетягиваем на форму вышеперечисленные компонеты и пишем фунцию. Функция выглядит таким образом:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
AnsiString LarionovSort(AnsiString asd)
{
 
 TStringList * list = new TStringList();  //создаём динамически объект класса TStringList
 list->DelimitedText = Trim(asd);         //разделяем строки в объекте list и удаляем передний и задний пробел в строке
 list->Delimiter = ' ';                   //разделитель
 
 asd ="";
 int *mass = new int[list->Count]; //создаём массив с текущей длиной по количеству строк объекта list класса TStringList();
 
 for(int d = 0; d < list->Count; d++)
 {
   mass[d] = list->Strings[d].ToInt();  //заносим данные в массив
 }
  // Cортировка Ларионова
  int ik = 0; // Число нечётных элементов перед просмотром mass
     for(int ij = 0, iByf; ij < list->Count; ++ij) //iByf от Byfer
      {
        if(mass[ij]%2==1)//Если число нечётное
        {
         iByf = mass[ik];//Временное хранение чётного элемента
         mass[ik] = mass[ij];//Меняем местами текущий нечётный элемент
         mass[ij] = iByf;//с первым чётным
         ik++;//счётчик числа нечётных элементов
        }
 
      }
 
 
 for (int s = 0; s < list->Count; s++)
   {
    asd+=IntToStr(mass[s])+ " ";       // заносим информацию из массива в переменную asd
   }
 
  delete [] mass; // удаление объекта массива созданного динамически
  mass = NULL;
  delete list;    // удаление объекта list созданного динамически
  list = NULL;
  return asd;
}
void __fastcall TForm1::PowerClick(TObject *Sender)
{
if(InputMas->Text.IsEmpty())
 {
    ShowMessage("Введите в поле через пробел вещественные числа ");
    InputMas->SetFocus();
    return;
 }
 OutputMas->Text = LarionovSort(InputMas->Text); //вызов функции  SelectionSort
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormShow(TObject *Sender)
{
InputMas->Text = "15 106 12 5 22";
}

Скриншот программы прилагается:

Нажмите на изображение для увеличения
Название: Безымянный.JPG
Просмотров: 1058
Размер:	12.1 Кб
ID:	2151



Программа создавалась в среде разработки С++Builder 6


Источник: Федоренко Ю.П "Алгоритмы и программы на С++ Builder" г. Москва, 2010 г.
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru