Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 02.03.2015
Сообщений: 6

Быстрая сортировка, WinForm

22.06.2015, 15:34. Показов 5048. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
есть почти что стандартная функция быстрой сортировки, по заданию нужно вывести пошаговое решение, то есть каждый шаг с отображением последовательности с перестановкой элемента. вывод в листбоксе, все значения добавляются в список. выдает результат не такой, как ожидалось (какая-то путаница получилось), помогите пожалуйста) и такой вопрос: препод захотела, чтобы элементы переставлялись анимацией, не знаю даже как сделать, по идее всю программу придется переписывать, или есть способ попроще?

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
public static void quickSort(int[] mass, int l, int r)
        {
            int temp;
            int x = mass[l + (r - l) / 2];
            //запись эквивалентна (l+r)/2, 
            //но не вызывает переполнения на больших данных
            int i = l;
            int j = r;
            
            //код в while обычно выносят в процедуру particle
            while (i <= j)
            {
                while (mass[i] < x) i++;
                while (mass[j] > x) j--;
                if (i <= j)
                {
                    temp = mass[i];
                    mass[i] = mass[j];
                    mass[j] = temp;
                    step++;
                    i++;
                    j--;
                    bukv.Add("Шаг" + (bukv.Count+1) + "  ");
                    for (int k = 0; k < mass.Length; k++)
                    {
                        bukv[bukv.Count-1] += mass[k].ToString() + " ";
                    }
                }
            }
            if (i < r)
                quickSort(mass, i, r);
 
            if (l < j)
                quickSort(mass, l, j);
        }
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.06.2015, 15:34
Ответы с готовыми решениями:

Разработать программу сортировки: сортировка перестановкой, сортировка вставкой, быстрая сортировка
Задание: Разработать программу сортировки: - сортировка перестановкой - сортировка вставкой - быстрая сортировка

Быстрая сортировка, ситуация, при которой сортировка работает не корректно
Procedure sort(m, l: Integer); Var i, j, x, w: Integer; Begin i := m; j := l; x := ar; Repeat While...

Быстрая сортировка (сортировка Хоара) для связных списков
есть у кого готовый алгоритм? или подскажите как реализовать

4
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
22.06.2015, 21:04
Лучший ответ Сообщение было отмечено vampir_4_ik как решение

Решение

Цитата Сообщение от vampir_4_ik Посмотреть сообщение
чтобы элементы переставлялись анимацией
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
using System;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;
 
namespace WindowsFormsApplication299
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true);
 
            MinimumSize = Size = new Size(650, 300);
 
            new Button { Parent = this, Text = "Start" }.Click += bt_Click;
        }
 
        void bt_Click(object sender, EventArgs e)
        {
            var arr = new int[] { 23, 43, 54, 23, 2, 45, 32, 45, 34};
            QuickSort(arr);
        }
 
        public void QuickSort(int[] mass)
        {
            QuickSort(mass, 0, mass.Length - 1);
        }
 
        public void QuickSort(int[] mass, int l, int r)
        {
            int temp;
            int x = mass[l + (r - l) / 2];
            //запись эквивалентна (l+r)/2, 
            //но не вызывает переполнения на больших данных
            int i = l;
            int j = r;
            
            //код в while обычно выносят в процедуру particle
            while (i <= j)
            {
                while (mass[i] < x) i++;
                while (mass[j] > x) j--;
                if (i <= j)
                {
                    AnimateSwap(mass, i, j);
                    temp = mass[i];
                    mass[i] = mass[j];
                    mass[j] = temp;
                    i++;
                    j--;
                }
            }
            if (i < r)
                QuickSort(mass, i, r);
 
            if (l < j)
                QuickSort(mass, l, j);
        }
 
        private int swapI;//swaping index1
        private int swapJ;//swaping index2
        private float t;//animation time (from 0 to 1)
        private int[] currentArr;//current array
 
        private void AnimateSwap(int[] arr, int i, int j)
        {
            swapI = i;
            swapJ = j;
            t = 0;
            currentArr = arr;
 
            Refresh();
 
            if (i == j)
                return;
 
            Thread.Sleep(1000);
 
            while(t < 1)
            {
                t += 0.03f;
                Refresh();
                Thread.Sleep(20);
            }
 
            swapJ = swapI = -1;
            Refresh();
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            if (currentArr == null)
                return;
 
            var w = 50;
            var dx = (swapJ - swapI) * w * t;
            var dy = ((float)Math.Pow(2 * t - 1, 2) - 1) * 25;
 
            for(int i=0;i<currentArr.Length;i++)
            {
                var x = (float)i * w + 50;
                var y = (float)Height/2 - 50;
                //
                if (i == swapI) { x += dx; y += dy; }
                if (i == swapJ) { x -= dx; y -= dy; }
                var rect = new Rectangle((int)x, (int)y, w - 5, 20);
                e.Graphics.FillRectangle(Brushes.SteelBlue, rect);
                e.Graphics.DrawString(currentArr[i].ToString(), Font, Brushes.White, rect, new StringFormat{Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center});
            }
        }
    }
}
1
0 / 0 / 0
Регистрация: 02.03.2015
Сообщений: 6
23.06.2015, 03:53  [ТС]
спасибо огромное) а такой вопрос, AnimateSwap подойдет и для сортировки вставками? по примеру получилось нечто такое, но там опять лажа, в анимации вообще не шарю -_-
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
using System;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;
 
namespace WindowsFormsApplication7
{
    public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
            SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true);
 
            MinimumSize = Size = new Size(1300, 300);
 
        }
 
 
       
        public void insertSort(int[] mass)
        {
            for (int i = 1; i < mass.Length; i++)
            {
 
                int cur = mass[i];
                int j = i;
                while (j > 0 && cur < mass[j - 1])
                {
                    
                    mass[j] = mass[j - 1];
                    AnimateSwap(mass, i, j);
                    j--;
 
                }
                mass[j] = cur;
            }
        }
 
        private int swapI;//swaping index1
        private int swapJ;//swaping index2
        private float t;//animation time (from 0 to 1)
        private int[] currentArr;//current array
 
        private void AnimateSwap(int[] arr, int i, int j)
        {
            swapI = i;
            swapJ = j;
            t = 0;
            currentArr = arr;
 
            Refresh();
 
            if (i == j)
                return;
 
            Thread.Sleep(1000);
 
            while (t < 1)
            {
                t += 0.03f;
                Refresh();
                Thread.Sleep(20);
            }
 
            swapJ = swapI = -1;
            Refresh();
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            if (currentArr == null)
                return;
 
            var w = 120;
            var dx = (swapJ - swapI) * w * t;
            var dy = ((float)Math.Pow(2 * t - 1, 2) - 1) * 25;
 
            for (int i = 0; i < currentArr.Length; i++)
            {
                var x = (float)i * w + 50;
                var y = (float)Height / 2 - 50;
                //
                if (i == swapI) { x += dx; y += dy; }
                if (i == swapJ) { x -= dx; y -= dy; }
                var rect = new Rectangle((int)x, (int)y, w - 5, 20);
                e.Graphics.FillRectangle(Brushes.SteelBlue, rect);
                e.Graphics.DrawString(currentArr[i].ToString(), Font, Brushes.White, rect, new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
            }
        }
        private void Form3_Load(object sender, EventArgs e)
        {
 
        }
 
    }
}
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
23.06.2015, 17:28
Цитата Сообщение от vampir_4_ik Посмотреть сообщение
AnimateSwap подойдет и для сортировки вставками
Нет, не подойдет. Он анимирует обмен между ячейками массива, а в сортировке вставками нет обмена.
0
0 / 0 / 0
Регистрация: 02.03.2015
Сообщений: 6
23.06.2015, 18:30  [ТС]
Цитата Сообщение от Storm23 Посмотреть сообщение
Нет, не подойдет. Он анимирует обмен между ячейками массива, а в сортировке вставками нет обмена.
большое спасибо) и последний вопрос, как можно добавить кнопку и сделать пошаговую смену значений? нажал кнопку, поменялось, нажал - поменялось. то есть чтобы после каждого обмена программа становилась на паузу, а кнопка продолжала на время 1 обмена
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.06.2015, 18:30
Помогаю со студенческими работами здесь

Быстрая сортировка(сортировка Хоара). Отсортировать фрагмент массива
Мне нужно отсортировать фрагмент массива, расположенный между первым и последним отрицательным элементом. Немогу понять как устоновить...

Быстрая сортировка и Обменная сортировка - реализация API функции
Всех приветствую! Делаю курсовой проект и появилась одна проблем-ка.... У меня есть готовые две программы(быстрая сортировка и Обменная...

Сортировка Шелла быстрее чем Быстрая сортировка
В универе задали задание построить графики относительно скорости сортировок и размеров массивов. Есть 4 массива, по сути, неважно какие,...

Сортировка Слиянием vs Быстрая Сортировка - что лучше
Народ, помогите разобраться какой из методов сортировки лучше &quot;Сортировка Слиянием&quot; или &quot;Быстрая Сортировка&quot;: у быстрой...

Сортировка Хоара (быстрая сортировка) по убыванию
Помогите найти/написать/понять/отобразить как пишется код для данного задания или хотя бы часть кода в C++ Builder Найти в заданной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru