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

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

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

Author24 — интернет-сервис помощи студентам
Как отсортировать одномерный массив методом Быстрой сортировки?
Вот код записи данных в массив!
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.07.2013, 13:57
Ответы с готовыми решениями:

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

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

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

Предложить метод сортировки текстового массива, отличный от WordBasic.SortArray
Доброго времени суток! Помогите !: Есть одномерный текстовый массив m() содержащий набор...

38
6930 / 2838 / 545
Регистрация: 19.10.2012
Сообщений: 8,670
03.07.2013, 14:08 2
И чего бы не отсортировать диапазон на листе и не взять в массив верхушку (в двумерный)?
Или взять всё в двумерный, отсортировать как угодно готовой функцией (их много всяких), затем переложить верхушку (или пользовать как есть, отбросив хвост)?
Оба способа думаю будут быстрее самой "Быстрой сортировки" после того, что в примере. Если брать весь процесс в целом.
И зачем непременно нужен одномерный массив?
0
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 71
03.07.2013, 14:19  [ТС] 3
Цитата Сообщение от Hugo121 Посмотреть сообщение
И чего бы не отсортировать диапазон на листе и не взять в массив верхушку (в двумерный)?
Или взять всё в двумерный, отсортировать как угодно готовой функцией (их много всяких), затем переложить верхушку (или пользовать как есть, отбросив хвост)?
Оба способа думаю будут быстрее самой "Быстрой сортировки" после того, что в примере. Если брать весь процесс в целом.
И зачем непременно нужен одномерный массив?
Такое уж задание? Сделать диалог выбора сортировки "Пузырьковая и Быстрая". С Пузырьковой разобрался, а вот с Быстрой туплю по-жесткому!
0
6930 / 2838 / 545
Регистрация: 19.10.2012
Сообщений: 8,670
03.07.2013, 14:22 4
Я наизусть не знаю - но где-тут ведь была тема со всеми сортировками.
0
призрак
3263 / 891 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
03.07.2013, 21:08 5
ключевое слово для поиска по форуму: quicksort
причём делать это надо было до создания темы.
0
0 / 0 / 0
Регистрация: 24.06.2013
Сообщений: 71
04.07.2013, 10:49  [ТС] 6
Как отсортировать одномерный массив методом Быстрой сортировки?
Вот код записи данных в массив!
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  [ТС] 7
При работе скрипта вылетает ошибка "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
18007 / 7708 / 892
Регистрация: 25.12.2011
Сообщений: 11,481
Записей в блоге: 16
04.07.2013, 12:54 8
и не одна.

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  [ТС] 9
Цитата Сообщение от 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 10
Вчера была Ваша тема про переменные. Я там как раз и говорил Вам ( и Султанов) про передачу аргументов в процедуру. А здесь Вы именнто это делаете, но используете сокращенную запись ( без присваивания :=), что тоже правильно по синтаксису языка. Ваша запись
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  [ТС] 11
Цитата Сообщение от 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 12
У Вас есть процедура с обязательными аргументами - 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  [ТС] 13
Цитата Сообщение от Igor_Tr Посмотреть сообщение
Делаете две процедуры с аргументами (QSort расписано правильно). Одна - для пузырьковой (пусть QSort1(аргументы)), вторая - для быстрой (пусть QSort2(аргументы)). И поочереди вызываете - сохраняете где-то результаты. Можно совместить, но всеравно желательно результары разделить (они должны бы быть одинаковые - но так будет нагляднее). Разница должна быть (не обязательно) в времени.
Не в этом дело! Высвечивается MsgBox, если Нажмешь "Да", то пройдет пузырьковая сортировка, если "Нет", то быстрая, а если нажата отмена, то Идет запись без сортировки!
0
Эксперт WindowsАвтор FAQ
18007 / 7708 / 892
Регистрация: 25.12.2011
Сообщений: 11,481
Записей в блоге: 16
04.07.2013, 14:08 14
Trojan52, да, сорри, не учел момент, что здесь рекурсия:

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

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

Добавлено через 55 секунд
Цитата Сообщение от Igor_Tr Посмотреть сообщение
Вы его вручную выделяете?
Да, диапазон выделяется вручную!
Ошибка только в frmList!
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
04.07.2013, 14:53 20
Не могу понять, что Вы имеете ввиду под переменной low?
1
04.07.2013, 14:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.07.2013, 14:53
Помогаю со студенческими работами здесь

Как изменить код VBA для сортировки, минуя метод "Debug.Print"?
Здравствуйте! Прошу помощи. Есть интересная тема...

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru