ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² написании студСнчСских Ρ€Π°Π±ΠΎΡ‚
АнтистрСссовый сСрвис

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. 
ИсслСдованиС ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² сортировки Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ

Π Π΅Ρ„Π΅Ρ€Π°Ρ‚ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

ΠŸΠΈΡ€Π°ΠΌΠΈΠ΄Π°Π»ΡŒΠ½Π°Ρ сортировка // Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ рСсурс Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠ° Π Π΅ΠΆΠΈΠΌ доступа: https://ru.wikipedia.org/wiki/ΠŸΠΈΡ€Π°ΠΌΠΈΠ΄Π°Π»ΡŒΠ½Π°Ρ_сортировка — Π—Π°Π³Π» с ΡΠΊΡ€Π°Π½Π° Π―Π·. рус., Π°Π½Π³Π». For (i = array. Length / 2 — 1; i ≥ 0; i—) // элСмСнты с Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌΠΈ начиная с array. Length / 2 — 1 это Π»ΠΈΡΡ‚ΡŒΡ, Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΡŒΡ с ΠΊΠΎΡ€Π½ΡΠΌΠΈ Π² ΠΈΠ½Π΄Π΅ΠΊΡΠ°Ρ…. Int curState; // ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ curState — это Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. ИсслСдованиС ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² сортировки Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

Π―Π·Ρ‹ΠΊ программирования C# Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Visual Studio способСн Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ срСдства для сортировки Π΄Π°Π½Π½Ρ‹Ρ….

Π’ΠΎ Π²Ρ€Π΅ΠΌΡ выполнСния поставлСнной Π·Π°Π΄Π°Ρ‡ΠΈ Π±Ρ‹Π»ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Ρ‹ Π½Π°Π²Ρ‹ΠΊΠΈ программирования, Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ сортировок. Разработанная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° наглядно дСмонстрируСт Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ 3 ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² сортировки. ОсновноС прСимущСство ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ — Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ сортировки динамичСски Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

Π‘Ρ‹Π» ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½ Π°Π½Π°Π»ΠΈΠ· ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π½ΠΎΠΉ области, выявлСны трСбования ΠΊ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Π±Ρ‹Π»ΠΎ спроСктировано ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Π°.

Бписок ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… источников

  • 1. Плавная сортировка // Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ рСсурс Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠ° [Π­Π»Π΅ΠΊΡ‚Ρ€ΠΎΠ½Π½Ρ‹ΠΉ рСсурс] Π Π΅ΠΆΠΈΠΌ доступа: https://ru.wikipedia.org/wiki/Плавная_сортировка — Π—Π°Π³Π» с ΡΠΊΡ€Π°Π½Π° Π―Π·. рус., Π°Π½Π³Π».
  • 2. ΠŸΠΈΡ€Π°ΠΌΠΈΠ΄Π°Π»ΡŒΠ½Π°Ρ сортировка // Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ рСсурс Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠ° [Π­Π»Π΅ΠΊΡ‚Ρ€ΠΎΠ½Π½Ρ‹ΠΉ рСсурс] Π Π΅ΠΆΠΈΠΌ доступа: https://ru.wikipedia.org/wiki/ΠŸΠΈΡ€Π°ΠΌΠΈΠ΄Π°Π»ΡŒΠ½Π°Ρ_сортировка — Π—Π°Π³Π» с ΡΠΊΡ€Π°Π½Π° Π―Π·. рус., Π°Π½Π³Π».
  • 3. Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ // Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ рСсурс Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠ° [Π­Π»Π΅ΠΊΡ‚Ρ€ΠΎΠ½Π½Ρ‹ΠΉ рСсурс] Π Π΅ΠΆΠΈΠΌ доступа: https://ru.wikipedia.org/wiki/Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ°_Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ — Π—Π°Π³Π» с ΡΠΊΡ€Π°Π½Π° Π―Π·. рус., Π°Π½Π³Π».
  • 4. Π“Π΅Ρ€Π±Π΅Ρ€Ρ‚ Π¨ΠΈΠ»Π΄Ρ‚, C# 4.0 ПолноС руководство, ΡƒΡ‡Π΅Π±Π½ΠΎΠ΅ пособиС [ВСкст] // Π“Π΅Ρ€Π±Π΅Ρ€Ρ‚ Π¨ΠΈΠ»Π΄Ρ‚. — ΠœΠΎΡΠΊΠΎΠ²ΡΠΊΠΈΠΉ Π΄ΠΎΠΌ ΠΊΠ½ΠΈΠ³ΠΈ, 2008. — 340с.
  • 5. Π”ΠΎΠ½Π°Π»ΡŒΠ΄ ΠšΠ½ΡƒΡ‚, Π˜ΡΠΊΡƒΡΡΡ‚Π²ΠΎ программирования, Ρ‚ΠΎΠΌ 3. Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΈ ΠΏΠΎΠΈΡΠΊ [ВСкст] // Π”ΠΎΠ½Π°Π»ΡŒΠ΄ ΠšΠ½ΡƒΡ‚. — Π’ΠΈΠ»ΡŒΡΠΌΡ, 2007. — 457с.

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

Листинг ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

using System;

using System.Collections.Generic;

using System. ComponentModel;

using System. Data;

using System. Drawing;

using System. Linq;

using System. Text;

using System.Threading.Tasks;

using System.Windows.Forms;

namespace ApplicationSort.

{.

public partial class Form1: Form.

{.

public Form1().

{.

InitializeComponent ();

comboBox1.DropDownStyle = ComboBoxStyle. DropDownList;

comboBox1.SelectedIndex = 0;

}.

private void button1_Click (object sender, EventArgs e) // Π·Π°Π΄Π°Ρ‚ΡŒ Ρ€Π°Π½Π΄ΠΎΠΌ.

{.

Random rand = new Random ();

richTextBox1.Clear ();

for (int i = 0; i < 100; i++).

richTextBox1.Text += rand. Next (0, 100) + ««;

}.

private void button2_Click (object sender, EventArgs e).

{.

try.

{.

// присваиваСм int[]arr значСния Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ ΠΈΠ»ΠΈ сгСнСрированныС.

int[] arr = richTextBox1.Text.

Split (new char[] { ` ' }, StringSplitOptions. RemoveEmptyEntries).

.Select (x => int. Parse (x))//ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ LINQ, для удобства ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚Π°Ρ†ΠΈΠΈ string -> int.

.ToArray ();

// значСния индСкса соотвСтствуСт Π²Ρ‹Π·ΠΎΠ²Ρƒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

int k = comboBox1. SelectedIndex;

if (k == 0).

heapSort (arr); // Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ сортировки ΠΏΠΈΡ€Π°ΠΌΠΈΠ΄ΠΎΠΉ.

else if (k == 1).

selectSort (arr); // Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ сортировку Π²Ρ‹Π±ΠΎΡ€ΠΊΠΎΠΉ.

else.

smoothSort (arr); // Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ ΠΏΠ»Π°Π²Π½ΡƒΡŽ сортировку.

Print (arr); // Π²Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°.

// ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ.

}.

catch (ArgumentNullException ex) // Ссли значСния ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ нСдопустимый Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚.

{.

MessageBox.Show (ex.Message);

}.

catch (FormatException).

{.

MessageBox.Show («Π’Π²ΠΎΠ΄ΠΈΡ‚Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ†Π΅Π»Ρ‹Π΅ числа»);

}.

catch (Exception exp) // ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΡƒΠ½Ρ‚ΡŒ Π²ΠΎ Π²Ρ€Π΅ΠΌΡ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

{.

MessageBox.Show (exp.Message);

}.

}.

private void Print (int[] array) // Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

{.

richTextBox2.Clear (); // ΠΎΡ‡ΠΈΡ‰Π΅Π½ΠΈΠ΅ поля.

foreach (var x in array) // ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ… Π²ΡΠ΅Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ массива array, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ записываСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ сортировки Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ.

richTextBox2.Text += x + ««; // Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ этих Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

}.

private void selectSort (int[] array) // сортировка Π²Ρ‹Π±ΠΎΡ€ΠΊΠΎΠΉ.

{.

int min; // объявляСм min.

for (int i = 0; i < array. Length; i++) // ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅ΠΌ элСмСнты.

{.

min = i; // присваиваСм наимСньший элСмСнт i-ΠΎΠΌΡƒ.

for (int j = i + 1; j < array. Length; j++).

if (array[j] < array[min]) // Ссли элмСнСнт массива мСньшС минимального.

min = j; // присваиваСм Π½ΠΎΠ²ΠΎΠ΅ минимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ элСмСнту массиву.

// swap-функция. МСняСм мСстами значСния.

int temp = array[i];

array[i] = array[min];

array[min] = temp;

}.

}.

private void heapSort (int[] array) // сортировка ΠΏΠΈΡ€Π°ΠΌΠΈΠ΄ΠΎΠΉ.

{.

int i, temp; // объявляСм ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.

for (i = array. Length / 2 — 1; i >= 0; i—) // элСмСнты с Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌΠΈ начиная с array. Length / 2 — 1 это Π»ΠΈΡΡ‚ΡŒΡ, Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΡŒΡ с ΠΊΠΎΡ€Π½ΡΠΌΠΈ Π² ΠΈΠ½Π΄Π΅ΠΊΡΠ°Ρ….

downHeap (array, i, array. Length — 1); // вызываСтся функция downHeap ΠΈ Π΅ΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ся Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹.

for (i = array. Length — 1; i > 0; i—).

{.

temp = array[i];

array[i] = array[0];

array[0] = temp;

downHeap (array, 0, i — 1); // Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ с ΡˆΠ°Π³ΠΎΠΌ — 1.

}.

}.

private void downHeap (int[] array, int k, int n) // функция Π½ΠΈΠΆΠ½Π΅ΠΉ сортировки.

{.

// объявляСм ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.

int new_elem;

int child;

new_elem = array[k];

while (k <= n / 2) // ΠΏΠΎΠΊΠ° Ρƒ array[k] Π΅ΡΡ‚ΡŒ Π΄Π΅Ρ‚ΠΈ выполняСм.

{.

child = 2 * k;

// Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ большСго сына.

if (child < n && array[child] < array[child + 1]).

child++;

if (new_elem >= array[child]) break;

// ΠΈΠ½Π°Ρ‡Π΅.

array[k] = array[child]; // пСрСносим сына Π½Π°Π²Π΅Ρ€Ρ….

k = child;

}.

array[k] = new_elem;

}.

// ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ формирования чисСл Π›Π΅ΠΎΠ½Π°Ρ€Π΄ΠΎ L (N) = L (N-1) + L (N-2) + 1.

int[] LeoNum = { 1, 1, 3, 5, 9, 15, 25, 41, 67, 109, 177, 287, 465, 753, 1219, 1973, 3193, 5167, 8361, 13 529, 21 891, 35 421, 57 313, 92 735, 150 049, 242 785, 392 835, 635 621, 1 028 457, 1 664 079, 2 692 537, 4 356 617, 7 049 155, 11 405 773, 18 454 929, 29 860 703, 48 315 633, 78 176 337, 126 491 971, 204 668 309, 331 160 281, 535 828 591, 866 988 873, 1 402 817 465 }; // числа Π»Π΅ΠΎΠ½Π°Ρ€Π΄ΠΎ.

int curState; // ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ curState — это Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊΡƒΡ‡, Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ прСдставлСниС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π·Π°Π΄Π°Π΅Ρ‚ размСрности этих ΠΊΡƒΡ‡.

// Π”Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ прСдставлСниС числа curState являСтся описаниСм.

// Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ состояния массива ΠΊΡƒΡ‡.

// Π”Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ прСдставлСниС: 10 110.

// Числа Π›Π΅ΠΎΠ½Π°Ρ€Π΄ΠΎ 95 311.

// Π’. Π΅. ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 9 элСмСнтов — это пСрвая ΠΊΡƒΡ‡Ρƒ, Π²Ρ‚ΠΎΡ€Ρ‹Π΅ 3 — вторая ΠΊΡƒΡ‡Π°,.

// ΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ — это Ρ‚Ρ€Π΅Ρ‚ΡŒΡ ΠΊΡƒΡ‡Π°.

// ПослС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ число curState Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ массив ΠΊΡƒΡ‡ послС добавлСния.

// ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта Π² ΠΊΠΎΠ½Π΅Ρ†. Π•Π³ΠΎ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ прСдставлСниС Π±ΡƒΠ΄Π΅Ρ‚ 11 000 = 24.

// Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: НомСр Π±ΠΈΡ‚Π°, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ послСднСй ΠΊΡƒΡ‡ΠΈ, Ссли Ρ‚Π° ΡΠΎΡΡ‚ΠΎΠΈΡ‚ Π±ΠΎΠ»Π΅Π΅,.

// Ρ‡Π΅ΠΌ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта.

private int NextState (ref int curState) // Ѐункция NextState, Π΄Π΅Π»Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ, Π½ΠΎ ΠΏΡ€ΠΈ этом ΠΎΠ½Π° Π΅Ρ‰Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠΌΠ΅Ρ€ Π±ΠΈΡ‚Π°, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ послСднСй ΠΊΡƒΡ‡ΠΈ, Ссли Ρ‚Π° ΡΠΎΡΡ‚ΠΎΠΈΡ‚ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ -1.

{.

int posNewTop = -1; // позиция Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½Π½Ρ‹Ρ… ΠΊΡƒΡ‡.

// ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.

if ((curState & 7) == 5).

{ // curState = 0101.

curState += 3; // curState = 1000.

posNewTop = 3;

}.

else // пытаСмся Π½Π°ΠΉΡ‚ΠΈ Π΄Π²Π° подряд Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹Ρ… Π±ΠΈΡ‚Π°.

{.

int next = curState;

int pos = 0;

while (next ≠ 0 && (next & 3) ≠ 3).

{.

next >>= 1;

pos++;

}.

if ((next & 3) == 3) // curState = 1 100.

{.

curState += 1 << pos; // curState = 10 000.

posNewTop = pos + 2;

}.

else if ((curState & 1) ≠ 0) // curState = x001.

curState |= 2; // curState = x011.

else // curState = xx00.

curState |= 1; // curState = xx01.

}.

return posNewTop;

}.

private void PrevState (ref int curState) //Ѐункция PrevState измСняСт Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²Π΅Ρ€ΡˆΠΈΠ½Π° послСднСй ΠΊΡƒΡ‡ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½Π° ΠΈΠ· Ρ€Π°ΡΡΠΌΠΎΡ‚рСния.

{.

if ((curState & 15) == 8).

{ // curState = 1000.

curState -= 3; // curState = 0101.

}.

else if ((curState & 1) ≠ 0).

{.

if ((curState & 3) == 3) // curState = x011.

curState ^= 2; // curState = x001.

else // curState = xx01.

curState ^= 1; // curState = xx00.

}.

else // ΠΈΡ‰ΠΈΠΌ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹ΠΉ Π±ΠΈΡ‚.

{.

int prev = curState;

int pos = 0;

while (prev ≠ 0 && !(Convert.ToBoolean (prev & 1))).

{.

prev >>= 1;

pos++;

}.

if (prev ≠ 0) // curState = xx10000.

{.

curState ^= 1 << pos;

curState |= 1 << (pos — 1);

curState |= 1 << (pos — 2); // curState = xx01100.

}.

else.

curState = 0;

}.

}.

private void shiftDown (int[] mas, int posHeapItemsAmount, int indexLastTop) // РСализация Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ просСйки Π²Π½ΠΈΠ·, Π² Π½Π΅ΠΉ задаСтся Ρ‚Π°ΠΊΠΆΠ΅ mas[].

{.

int posCurNode = indexLastTop; //indexLastTop — индСкс ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹.

while (posHeapItemsAmount > 1) //nextPosHeapItemsAmount — количСство элСмСнтво Π² ΠΊΡƒΡ‡ΠΈ, Π²Π΅Ρ€ΡˆΠΈΠ½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ оказалось максимальной ΠΈΠ· Π²ΡΠ΅Ρ… Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΊΡƒΡ‡.

{.

// позиция ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ сына.

int posR = posCurNode — 1;

// позиция Π»Π΅Π²ΠΎΠ³ΠΎ сына.

int posL = posR — LeoNum[posHeapItemsAmount — 2]; // число элСмСнтов Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΊΡƒΡ‡ΠΈ.

int posMaxChild = posL;

int posNextTop = posHeapItemsAmount — 1;

if (mas[posR] > mas[posL]) // Ссли позиция ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ сына большС Π»Π΅Π²ΠΎΠ³ΠΎ.

{.

posMaxChild = posR; // Ρ‚ΠΎ «ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ сын» ΠΏΡ€Π°Π²Ρ‹ΠΉ.

posNextTop = posHeapItemsAmount — 2;

}.

if (mas[posCurNode] < mas[posMaxChild]).

{.

swap (ref mas[posCurNode], ref mas[posMaxChild]);

posHeapItemsAmount = posNextTop;

posCurNode = posMaxChild;

}.

else.

break;

}.

}.

private void make_heap_pool (int[] mas) // Ѐункция создания ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊΡƒΡ‡ ΠΈΠ· ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ массива.

{.

for (int i = 0; i < mas. Length; i++).

{.

int posHeapItemsAmount = NextState (ref curState);

if (posHeapItemsAmount ≠ -1).

shiftDown (mas, posHeapItemsAmount, i);

}.

}.

// Π‘Ρ€Π΅Π΄ΠΈ Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΊΡƒΡ‡ Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт.

// mas — массив.

// curState — число, Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ прСдставлСниС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ описываСт Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ массив ΠΊΡƒΡ‡.

// indexLastTop — индСкс ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹.

// nextPosHeapItemsAmount — количСство элСмСнтво Π² ΠΊΡƒΡ‡ΠΈ, Π²Π΅Ρ€ΡˆΠΈΠ½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ оказалось максимальной ΠΈΠ· Π²ΡΠ΅Ρ… Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΊΡƒΡ‡.

// Π’ΠΎΠ·Π²Ρ€Π°Ρ‚: индСкс элСмСнта (ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΊΡƒΡ‡ΠΈ), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ большС Ρ‡Π΅ΠΌ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ ΠΊΡƒΡ‡.

private int findPosMaxElem (int[] mas, int curState, int indexLastTop, ref int nextPosHeapItemsAmount) // Ѐункция поиска максимального элСмСнта срСди Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΊΡƒΡ‡.

{.

int pos = 0;

// ΠΈΡ‰ΠΈΠΌ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π°.

while (!Convert.ToBoolean (curState & 1)).

{.

curState >>= 1;

pos++;

}.

int posMaxTopElem = indexLastTop;

nextPosHeapItemsAmount = pos;

int curTopElem = indexLastTop — LeoNum[pos];

curState >>= 1;

pos++;

while (curState ≠ 0).

{.

if ((curState & 1) ≠ 0).

{.

if (mas[curTopElem] > mas[posMaxTopElem]).

{.

posMaxTopElem = curTopElem;

nextPosHeapItemsAmount = pos;

}.

curTopElem -= LeoNum[pos];

}.

curState >>= 1;

pos++;

}.

return posMaxTopElem;

}.

private void smoothSort (int[] mas) // функция плавная сортировки.

{.

make_heap_pool (mas); // Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΡΠΎΠ·Π΄Π°ΡŽΡ‰Π΅ΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΡƒΡ‡ ΠΈΠ· ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ массива.

for (int i = mas. Length — 1; i >= 0; i—).

{.

int nextPosHeapItemsAmount = 0;

int posMaxTopElem = findPosMaxElem (mas, curState, i, ref nextPosHeapItemsAmount); // ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ элСмСнт ΠΊΡƒΡ‡ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Π²ΠΈΠ΄Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ findPosMaxElem.

if (posMaxTopElem ≠ i).

{.

swap (ref mas[i], ref mas[posMaxTopElem]); // Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ swap ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π² Π½Π΅Π΅ значСния mas[i] ΠΈ mas[posMaxTopElem].

shiftDown (mas, nextPosHeapItemsAmount, posMaxTopElem); // Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ shiftDown.

}.

PrevState (ref curState); // Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ PreveState ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ значСния, ΡΡΡ‹Π»Π°ΡΡΡŒ (ref) Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ curState.

}.

}.

private void swap (ref int a, ref int b) // функция пСрСстановки (swap).

{.

int temp = b;

b = a;

a = temp;

}.

}.

}.

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ