Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/55: Рейтинг темы: голосов - 55, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 71

Метод быстрой сортировки

03.07.2013, 13:57. Показов 10751. Ответов 38
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как отсортировать одномерный массив методом Быстрой сортировки?
Вот код записи данных в массив!
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
intI = 1
    intCountCells = 0
    For intI = 1 To intCnt
        If Sheets(2).Cells(intI, 2).Value <> "" Then
            intCountCells = intCountCells + 1   
        End If
    Next intI
    intI = 0
    ReDim intArr(intCountCells)   
    For intI = 0 To intCountCells
        intArr(intI) = Sheets(2).Cells(intI + 1, 2).Value  
    Next intI
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.07.2013, 13:57
Ответы с готовыми решениями:

Алгоритм быстрой сортировки для двумерного массива. Получается, чем меньше столбцов, тем быстрее сортировка
Написал процедуру для сортировки двумерного массива. Для того, чтобы можно было менять число строк в массиве с сохранением его значений...

Как расписать "по шагам" процесс быстрой сортировки массива.
По сортировке: дан массив 5,1,4,7,6,9,2,8 Распишите &quot;по шагам&quot; процесс его быстрой сортировки. Как это сделать, помогите,...

Отсортировать массив, используя метод сортировки выборками
Задан массив вещественных чисел А. Выполнить сортировку элементов массива, т.е. расположить элементы в порядке убывания (или возрастания),...

38
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
03.07.2013, 14:08
И чего бы не отсортировать диапазон на листе и не взять в массив верхушку (в двумерный)?
Или взять всё в двумерный, отсортировать как угодно готовой функцией (их много всяких), затем переложить верхушку (или пользовать как есть, отбросив хвост)?
Оба способа думаю будут быстрее самой "Быстрой сортировки" после того, что в примере. Если брать весь процесс в целом.
И зачем непременно нужен одномерный массив?
0
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 71
03.07.2013, 14:19  [ТС]
Цитата Сообщение от Hugo121 Посмотреть сообщение
И чего бы не отсортировать диапазон на листе и не взять в массив верхушку (в двумерный)?
Или взять всё в двумерный, отсортировать как угодно готовой функцией (их много всяких), затем переложить верхушку (или пользовать как есть, отбросив хвост)?
Оба способа думаю будут быстрее самой "Быстрой сортировки" после того, что в примере. Если брать весь процесс в целом.
И зачем непременно нужен одномерный массив?
Такое уж задание? Сделать диалог выбора сортировки "Пузырьковая и Быстрая". С Пузырьковой разобрался, а вот с Быстрой туплю по-жесткому!
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
03.07.2013, 14:22
Я наизусть не знаю - но где-тут ведь была тема со всеми сортировками.
0
призрак
 Аватар для ikki
3265 / 893 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
03.07.2013, 21:08
ключевое слово для поиска по форуму: quicksort
причём делать это надо было до создания темы.
0
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 71
04.07.2013, 10:49  [ТС]
Как отсортировать одномерный массив методом Быстрой сортировки?
Вот код записи данных в массив!
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
intI = 1
    intCountCells = 0
    For intI = 1 To intCnt
        If Sheets(2).Cells(intI, 2).Value <> "" Then
            intCountCells = intCountCells + 1   
        End If
    Next intI
    intI = 0
    ReDim intArr(intCountCells)   
    For intI = 0 To intCountCells
        intArr(intI) = Sheets(2).Cells(intI + 1, 2).Value  
    Next intI
0
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 71
04.07.2013, 12:07  [ТС]
При работе скрипта вылетает ошибка "Out of stack space"! Как исправить не понимаю! Может есть какая-нибудь ошибка?
Вот код!
Visual Basic
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
Public Sub QSort(ByRef intArr() As Integer, ByVal low As Integer, ByVal high As Integer)
    Dim i As Integer, j As Integer
    Dim m, wsp As Double
    low = LBound(intArr)
    high = UBound(intArr)
    i = low
    j = high
    m = intArr((i + j) \ 2)
    Do While i < j
        Do While intArr(i) < m
            i = i + 1
        Loop
        Do While intArr(j) > m
            j = j - 1
        Loop
        If i <= j Then
            wsp = intArr(i)
            intArr(i) = intArr(j)
            intArr(j) = wsp
            i = i + 1
            j = j - 1
        End If
    Loop
    If low < j Then Call QSort(intArr, low, j)
    If i < high Then Call QSort(intArr, i, high)
    frmList.lstCells.List = intArr
End Sub
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18026 / 7729 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
04.07.2013, 12:54
и не одна.

Visual Basic
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
Sub QSort(intArr(), optional low As Integer, optional high As Integer)
  Dim m As long
  Dim wsp As integer, i As Integer, j As Integer
  i = low
  j = high
  m = intArr((i + j) \ 2)
  Do While (i <= j)
    Do While (intArr(i) < m And i < high)
      i = i + 1
    Loop
    Do While (m < intArr(j) And j > low)
      j = j - 1
    Loop
    If i < j Then
      wsp = intArr(i)
      intArr(i) = intArr(j)
      intArr(j) = wsp
    End If
    If i <= j Then
      i = i + 1
      j = j - 1
    End If
  Loop
  If low < j Then Call (QSort intArr, low, j)
  If i < high Then Call (QSort intArr, i, high)
End Sub
Добавлено через 4 минуты
Trojan52, а зачем дубли темы создаете, а? Нехорошо.
1
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 71
04.07.2013, 13:03  [ТС]
Цитата Сообщение от Dragokas Посмотреть сообщение
и не одна.
Не работает! Мой скрипт должен выполнять "Быструю сортировку"! Твой скрипт не сортирует ее до конца!

Добавлено через 1 минуту
Цитата Сообщение от Dragokas Посмотреть сообщение
Trojan52, а зачем дубли темы создаете, а? Нехорошо
В той теме никто не отвечал, а как удалять их я не знаю, ибо новичок!

Добавлено через 3 минуты
Может есть какие-то поправки у меня Excel 2007 и, например,
Visual Basic
1
If low < j Then Call (QSort intArr, low, j)
Работает только так:
Visual Basic
1
If low < j Then Call QSort (intArr, low, j)
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
04.07.2013, 13:36
Вчера была Ваша тема про переменные. Я там как раз и говорил Вам ( и Султанов) про передачу аргументов в процедуру. А здесь Вы именнто это делаете, но используете сокращенную запись ( без присваивания :=), что тоже правильно по синтаксису языка. Ваша запись
Call QSort (intArr, low, j)
звучит так - вызвать процедуру QSort и передать ей аргументы intArr, low, j.
А запись Call (QSort intArr, low, j) - вызвать не понятно что, но это непонятное должно иметь аргументы QSort, intArr, low, j. Поэтому и ругается.
0
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 71
04.07.2013, 13:47  [ТС]
Цитата Сообщение от Igor_Tr Посмотреть сообщение
Вчера была Ваша тема про переменные. Я там как раз и говорил Вам ( и Султанов) про передачу аргументов в процедуру. А здесь Вы именнто это делаете, но используете сокращенную запись ( без присваивания :=), что тоже правильно по синтаксису языка. Ваша запись
Call QSort (intArr, low, j)
звучит так - вызвать процедуру QSort и передать ей аргументы intArr, low, j.
А запись Call (QSort intArr, low, j) - вызвать не понятно что, но это непонятное должно иметь аргументы QSort, intArr, low, j. Поэтому и ругается.
Не совсем понял что значит "(без присваивания :=)"

Добавлено через 6 минут
Цитата Сообщение от Igor_Tr Посмотреть сообщение
Вчера была Ваша тема про переменные. Я там как раз и говорил Вам ( и Султанов) про передачу аргументов в процедуру. А здесь Вы именнто это делаете, но используете сокращенную запись ( без присваивания :=), что тоже правильно по синтаксису языка. Ваша запись
Вот код, в котором почти в конце вызывается эта процедура!
Visual Basic
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
Private Sub cmdPrint_Click()
    frmList.lstCells.Clear
    Sheets(2).Columns("B:B").Value = ""
    Dim rngCell As Range, intI As Integer, intOtvet As Integer, intCnt As Integer, intCountCells As Integer
    intI = 1
    intCnt = Selection.Cells.count
    For Each rngCell In Selection
        Sheets(2).Cells(intI, 2) = rngCell.Value
        '        frmList.lstCells.AddItem rngCell.Value
        intI = intI + 1
    Next
    intI = 1
    intCountCells = 0
    For intI = 1 To intCnt
        If Sheets(2).Cells(intI, 2).Value <> "" Then
            intCountCells = intCountCells + 1    'Óçíàåì êîëè÷åñòâî ÿ÷ååê ñ äàííûìè
        End If
        If intCountCells = 0 Then
            MsgBox "Âûäåëèòå ÿ÷åéêè äëÿ çàïîëíåíèÿ!", vbCritical, "Îøèáêà"
            frmList.Hide
            GoTo EndS
        End If
    Next intI
    intI = 0
    ReDim intArr(intCountCells)    'Ìåíÿåì ðàçìåð ìàññèâà
    For intI = 0 To intCountCells
        intArr(intI) = Sheets(2).Cells(intI + 1, 2).Value  'Çàïîëíÿåì ìàññèâ äàííûìè èç ÿ÷ååê íà 2 ëèñòå
    Next intI
    ReDim Preserve intArr(intCountCells - 1)
 
    intOtvet = MsgBox("Íàæìèòå Äà äëÿ ïóçûðüêîâîé ñîðòèðîâêè." & Chr(10) & "Íàæìèòå Íåò äëÿ áûñòðîé ñîðòèðîâêè(ìåòîä Õîàðà)." & Chr(10) & "Íàæìèòå Îòìåíà äëÿ çàïèñè áåç ñîðòèðîâêè.", 3, "Âûáåðèòå òèï ñîðòèðîâêè")
    Select Case intOtvet
    Case 2
        frmList.lstCells.List = intArr()
        GoTo EndS
    Case 6
        
        Dim intP As Integer, intJ As Integer, intTmp As Integer
        For intP = 0 To intCountCells - 2
            For intJ = (intP + 1) To intCountCells - 1
                If intArr(intP) > intArr(intJ) Then
                    intTmp = intArr(intP)
                    intArr(intP) = intArr(intJ)
                    intArr(intJ) = intTmp
                End If
            Next intJ
        Next intP
        lstCells.List = intArr
        GoTo EndS
    Case 7
        Call QSort(intArr(), low, high)
        
    End Select
EndS:
End Sub
В нем присутствует пузырьковая сортировка и переход к другой процедуре, где должна выполняться "Быстрая сортировка!"Вот эта процедура
Visual Basic
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
Sub QSort(ByRef intArr() As Integer, Optional low As Integer, Optional high As Integer)
     Dim IntIm As Integer, intJn As Integer
    Dim intM As Integer, intWsp As Integer
    low = LBound(intArr)
    high = UBound(intArr)
    IntIm = low
    intJn = high
    intM = intArr((IntIm + intJn) \ 2)
    Do While IntIm < intJn
        Do While intArr(IntIm) < intM
            IntIm = IntIm + 1
        Loop
        Do While intArr(intJn) > intM
            intJn = intJn - 1
        Loop
        If IntIm <= intJn Then
            intWsp = intArr(IntIm)
            intArr(IntIm) = intArr(intJn)
            intArr(intJn) = intWsp
            IntIm = IntIm + 1
            intJn = intJn - 1
        End If
    Loop
    low = IntIm
    high = intJn
    If low < intJn Then Call QSort(intArr, low, intJn)
    If IntIm > high Then Call QSort(intArr, IntIm, high)
    
    frmList.lstCells.List = intArr
End Sub
Скорее всего я где-то сильно затупил, но где?
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
04.07.2013, 13:57
У Вас есть процедура с обязательными аргументами - Sub QSort(a, b, c). При ее вызове (Call) передаете ей аргументы. Можно разширенно - QSort(a:=intArr, b:=low, c:=j), а можна сокращенно, но обязательно соблюдать очередность (при написании, редактор должен показывать посказку) - QSort (intArr, low, j).

Добавлено через 6 минут
Делаете две процедуры с аргументами (QSort расписано правильно). Одна - для пузырьковой (пусть QSort1(аргументы)), вторая - для быстрой (пусть QSort2(аргументы)). И поочереди вызываете - сохраняете где-то результаты. Можно совместить, но всеравно желательно результары разделить (они должны бы быть одинаковые - но так будет нагляднее). Разница должна быть (не обязательно) в времени.
0
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 71
04.07.2013, 14:01  [ТС]
Цитата Сообщение от Igor_Tr Посмотреть сообщение
Делаете две процедуры с аргументами (QSort расписано правильно). Одна - для пузырьковой (пусть QSort1(аргументы)), вторая - для быстрой (пусть QSort2(аргументы)). И поочереди вызываете - сохраняете где-то результаты. Можно совместить, но всеравно желательно результары разделить (они должны бы быть одинаковые - но так будет нагляднее). Разница должна быть (не обязательно) в времени.
Не в этом дело! Высвечивается MsgBox, если Нажмешь "Да", то пройдет пузырьковая сортировка, если "Нет", то быстрая, а если нажата отмена, то Идет запись без сортировки!
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18026 / 7729 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
04.07.2013, 14:08
Trojan52, да, сорри, не учел момент, что здесь рекурсия:

нужно заменить строку 6 на:
Visual Basic
1
  m = intArr((low + high) \ 2)
1
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
04.07.2013, 14:16
Киньте лист с данными, которые Вы выделяете и сортируете. Прогоню у себя.

Добавлено через 3 минуты
Поздно увидел, что Dragokas уже разобрался.
1
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 71
04.07.2013, 14:16  [ТС]
Цитата Сообщение от Igor_Tr Посмотреть сообщение
Киньте лист с данными, которые Вы выделяете и сортируете. Прогоню у себя.
Прилагаю архив! С моим решением!
Вложения
Тип файла: rar Zadanie 6.rar (51.7 Кб, 32 просмотров)
0
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 71
04.07.2013, 14:29  [ТС]
Цитата Сообщение от Igor_Tr Посмотреть сообщение
Поздно увидел, что Dragokas уже разобрался.
Не разобрался, это ничего не изменило! Посмотрите код, если не сложно!
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
04.07.2013, 14:35
Посмотрю обязательно, ну у меня еще и работа... Не переживайте, все будет нормально. А пока вот-что. Гланул на код. Там работа с выделенным диапазоном (Select). Вы его вручную выделяете? И идет речь о D4:G15?
0
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 71
04.07.2013, 14:38  [ТС]
Цитата Сообщение от Igor_Tr Посмотреть сообщение
Поздно увидел, что Dragokas уже разобрался.
Все равно не работает! Он ничего не изменил этой строчкой!
Помогите!

Добавлено через 55 секунд
Цитата Сообщение от Igor_Tr Посмотреть сообщение
Вы его вручную выделяете?
Да, диапазон выделяется вручную!
Ошибка только в frmList!
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
04.07.2013, 14:53
Не могу понять, что Вы имеете ввиду под переменной low?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.07.2013, 14:53
Помогаю со студенческими работами здесь

Предложить метод сортировки текстового массива, отличный от WordBasic.SortArray
Доброго времени суток! Помогите !: Есть одномерный текстовый массив m() содержащий набор произвольных слов(ru/en) Dim m() As String ...

Как изменить код VBA для сортировки, минуя метод "Debug.Print"?
Здравствуйте! Прошу помощи. Есть интересная тема https://www.cyberforum.ru/visual-basic/thread110829.html Исправил в коде (автор:...

Метод быстрой сортировки
нужно написать программу сортировки используя метод быстрой сортировки, заполняя массив случайными числами, сам алгоритм понимаю, но в...

Метод быстрой сортировки!
:cry: помогите пожалуйста кто может!!! Осуществить сортировку массива методом &quot;быстрая сортировка&quot;. Алгоритм оформить в...

метод быстрой сортировки.
написать программу метододом быстрой сортировки. направление сортировки - спадение размерность массива - двухмерный тип элемента -...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как использовать Bluetooth-модуль HC-05 с Arduino
Wired 08.07.2025
Bluetooth - это технология, созданная чтобы заменить кабельные соединения. Обычно ее используют для связи небольших устройств: мобильных телефонов, ноутбуков, наушников и т. д. Работает она на частоте. . .
Руководство по структурам данных Python
AI_Generated 08.07.2025
Я отчетливо помню свои первые серьезные проекты на Python - я писал код, он работал, заказчики были относительно довольны. Но однажды мой наставник, взглянув на мою реализацию поиска по огромному. . .
Тестирование энергоэффективности и скорости вычислений видеокарт в BOINC проектах
Programma_Boinc 08.07.2025
Тестирование энергоэффективности и скорости вычислений видеокарт в BOINC проектах Опубликовано: 07. 07. 2025 Рубрика: Uncategorized Автор: AlexA Статья размещается на сайте с разрешения. . .
Раскрываем внутренние механики Android с помощью контекста и манифеста
mobDevWorks 07.07.2025
Каждый Android-разработчик сталкивается с Context и манифестом буквально в первый день работы. Но много ли мы задумываемся о том, что скрывается за этими обыденными элементами? Я, честно говоря,. . .
API на базе FastAPI с Python за пару минут
AI_Generated 07.07.2025
FastAPI - это относительно молодой фреймворк для создания веб-API, который за короткое время заработал бешеную популярность в Python-сообществе. И не зря. Я помню, как впервые запустил приложение на. . .
Основы WebGL. Раскрашивание вершин с помощью VBO
8Observer8 05.07.2025
На русском https:/ / vkvideo. ru/ video-231374465_456239020 На английском https:/ / www. youtube. com/ watch?v=oskqtCrWns0 Исходники примера:
Мониторинг микросервисов с OpenTelemetry в Kubernetes
Mr. Docker 04.07.2025
Проблема наблюдаемости (observability) в Kubernetes - это не просто вопрос сбора логов или метрик. Это целый комплекс вызовов, которые возникают из-за самой природы контейнеризации и оркестрации. К. . .
Проблемы с Kotlin и Wasm при создании игры
GameUnited 03.07.2025
В современном мире разработки игр выбор технологии - это зачастую балансирование между удобством разработки, переносимостью и производительностью. Когда я решил создать свою первую веб-игру, мой. . .
Создаем микросервисы с Go и Kubernetes
golander 02.07.2025
Когда я только начинал с микросервисами, все спорили о том, какой язык юзать. Сейчас Go (или Golang) фактически захватил эту нишу. И вот почему этот язык настолько заходит для этих задач: . . .
C++23, квантовые вычисления и взаимодействие с Q#
bytestream 02.07.2025
Я всегда с некоторым скептицизмом относился к громким заявлениям о революциях в IT, но квантовые вычисления - это тот случай, когда революция действительно происходит прямо у нас на глазах. Последние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru