ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅.
ΠΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ Π²ΡΠ±ΠΎΡΠΎΠΌ
ΠΠΈΡΠ°ΠΌΠΈΠ΄Π°Π»ΡΠ½Π°Ρ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° // ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ΅ΡΡΡΡ ΠΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠ° Π Π΅ΠΆΠΈΠΌ Π΄ΠΎΡΡΡΠΏΠ°: 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;
}.
}.
}.