1

Тема: AHK: Тонкости сортировки.

Обрабатываю информацию извлечённую из ListBox.  Распределил необходимые фрагменты, в соответсвии с их номерами в списке, в динамические переменные типа var%номер%, чтобы было удобно к ним обращаться.

Теперь не могу понять как  проще и быстре выяснить, каким номерам принадлжат максимальные значения переменных?

В "Sort" ничего похожего не нашёл. И вообще  на русском про "Sort" ничего не нашёл.
Подходящей математической функции тоже не обнаружил.
Не сравнивать же их поштучно? 

Заранее спасибо за помощь!

2

Re: AHK: Тонкости сортировки.

Единственое, что приходит на ум, раз не хочется самому писать функцию сортировки - слить все переменные в одну строку и отсортировать.

Max = 5

Var1 = 9.9
Var2 = 5
Var3 = 3
Var4 = 7
Var5 = 1

loop % Max {
  mtmp := mtmp Var%A_index% ","
}
StringTrimRight, mtmp, mtmp, 1
Sort, mtmp, N D,
MsgBox %mtmp%

Потом обратно через Loop, Parse разбить mtmp на переменные Var%n%

3 (изменено: creature.ws, 2012-08-07 13:15:16)

Re: AHK: Тонкости сортировки.

max := 11111
Loop % max  {
    Random, rand, 1, max
    var%A_Index% := rand
}

tmp := var1

Loop % max
    (var%A_Index% > tmp) && tmp := var%A_Index%
Loop % max
    (var%A_Index% = tmp) &&  varList .= "var" A_Index ", "


MsgBox % tmp " — большее значение`n" RTrim(varList, ", ") " — переменные содержащие большее значение множества"

4

Re: AHK: Тонкости сортировки.

Pokerist пишет:

Обрабатываю информацию извлечённую из ListBox.  Распределил необходимые фрагменты, в соответсвии с их номерами в списке, в динамические переменные типа var%номер%, чтобы было удобно к ним обращаться.

Теперь не могу понять как  проще и быстре выяснить, каким номерам принадлжат максимальные значения переменных?

В "Sort" ничего похожего не нашёл. И вообще  на русском про "Sort" ничего не нашёл.
Подходящей математической функции тоже не обнаружил.
Не сравнивать же их поштучно? 

ListBox может их сам сортировать в алфавитном порядке, см. соответствующий документации. Ну а если именно в массиве искать, то только руками, см. пузырьковую сортировку.

5

Re: AHK: Тонкости сортировки.

Irbis пишет:

Единственое, что приходит на ум, раз не хочется самому писать функцию сортировки - слить все переменные в одну строку и отсортировать.

Я не понял, а как тут сохраняется информация о номерах переменных? Как узнать, что строка находящаяся после сортировки на первом месте - это бывшая третья или та, что сейчас на четвёртом месте - это бывший номер два?

6

Re: AHK: Тонкости сортировки.

Александр_ пишет:

ListBox может их сам сортировать в алфавитном порядке, см. соответствующий документации.

Спасибо посмотрю, но скорее всего не подойдёт, поскольку сортирую не сами данные из ListBox.
Я извлекаю только каждую третью строку, а в ней выбираю элементы номер 3 и 5,  произвожу между ними манипуляции типа n3 ** / n5  для каждой строки,  и вот только тут мне нужно сортировать полученный результат.  Но , так, чтобы знать, что максимальное значение получено с данными извлечёнными и строки номер N и т.д.

Ну а если именно в массиве искать, то только руками, см. пузырьковую сортировку.

Спасибо, почитал. Именно такое решение я имел ввиду под сравнением "поштучно".  Но, насколько я понимаю, это довольно медленный процес, а мне скорость достаточно важна. Может ещё есть какеие-то способы решения? Готов рассмотреть любые идеи.

7 (изменено: creature.ws, 2012-08-07 13:55:12)

Re: AHK: Тонкости сортировки.

Выше пример обработки множества переменных

По поводу сортировки массива:

SetBatchLines -1
Process, Priority,, High


Loop 4096 {
    Random, rand, 1, 12345
    str .= rand "`n"
}

str := RTrim(str, "`n")

m := []
Loop, Parse, str,`n
    m[A_Index] := A_LoopField

t1 := A_TickCount
Sort, str, N
t1 := A_TickCount-t1

t2 := A_TickCount
Sort(m)
t2 := A_TickCount-t2

MsgBox % "Default Sort: " t1/1000 "sec`nCustom Sort: " t2/1000 "sec"

Sort(m)
{
    Loop % m.MaxIndex() {
        j := A_Index
        while (j > 0 && m[j-1] > m[j])
            tmp := m[j], m[j] := m[j-1], m[j-1] := tmp, j-=1
    }
    return m
}



For i, k in m
    o .= k ","
MsgBox % RTrim(o, ",")

8

Re: AHK: Тонкости сортировки.

Pokerist пишет:

насколько я понимаю, это довольно медленный процес, а мне скорость достаточно важна. Может ещё есть какеие-то способы решения? Готов рассмотреть любые идеи.

Что касается алгоритмической части- у Кнута всё расписано в пятой главе(3 том) "искусства программирования", но это 400 страниц математических выкладок, т.е. не чтиво на ночь. Тут лучше положиться на стандартную функцию, какой бы плохой она не была. Если данных много, то нужно сортировать во время заполнения listbox'а, т.е. добавили строку в список и сразу вычислили нужное значение и добавили в нужное место массива.

9

Re: AHK: Тонкости сортировки.

creature.ws пишет:
max := 11111
Loop % max  {
    Random, rand, 1, max
    var%A_Index% := rand
}

tmp := var1

Loop % max
    (var%A_Index% > tmp) && tmp := var%A_Index%
Loop % max
    (var%A_Index% = tmp) &&  varList .= "var" A_Index ", "


MsgBox % tmp " — большее значение`n" RTrim(varList, ", ") " — переменные содержащие большее значение множества"

Непривычный для меня формат записи.  Даже не могу понять на что ругается AHK:
Missing ")"
для строки  с третьим Loop. 

10

Re: AHK: Тонкости сортировки.

В ahk_L работает, не ругается.

(var%A_Index% = tmp) &&  varList .= "var" A_Index ", "

равнозначно

If (var%A_Index% = tmp)
    varList .= "var" A_Index ", "

11

Re: AHK: Тонкости сортировки.

creature.ws, большое спасибо,  разобрался и вижу, что всё удастся легко встроить в мой скрипт.
Короткий эффективный код!

12

Re: AHK: Тонкости сортировки.

creature.ws пишет:

В ahk_L работает, не ругается.

(var%A_Index% = tmp) &&  varList .= "var" A_Index ", "

равнозначно

If (var%A_Index% = tmp)
    varList .= "var" A_Index ", "

Что значит ".=" ?
Я что то не пойму ни первый вариант, ни второй. Как это код выглядит на C или Pascale?

13

Re: AHK: Тонкости сортировки.

Operators
var%A_Index% — имя переменной состоящее из строки "var" и содержимого переменной A_Index.

14 (изменено: Rediska, 2012-08-07 19:58:24)

Re: AHK: Тонкости сортировки.

Ну с .= все ясно.
А вот какую функцию тут выполняют && мне не ясно. Если это AND, то почему он не в If в "равнозначном" коде.

BTW в AHK_L удобней массивом пользоваться:

Var := [9.9, 5, 3, 7, 1]

Loop % Var.MaxIndex()
{
	... Var[%a_index%] ...

15

Re: AHK: Тонкости сортировки.

Кажется, разговор не в том направлении пошел.
В AHK v1 If (условие) действие в одну строку записать нельзя, && выполняет функцию синтаксического подслащивания.
Действия после && будут выполнены лишь если истинно условие до && > ссылка
Почитайте справку, там есть все ответы на базовые вопросы.

16 (изменено: Malcev, 2012-11-21 23:17:53)

Re: AHK: Тонкости сортировки.

На основе кода от Irbis сделал скрипт, который сортирует переменные.
А вот как сделать, чтобы переменная b сортировалась в зависимости от переменной a?
То есть если a1 после сортировки стала a5, то как сделать, чтобы и b1 после сортировки стала b5?

n = 5
i = 10
k = 1
loop 5
{
   a%k% := n
   MsgBox, a%k% = %n%
   b%k% := i
   MsgBox, b%k% = %i%
   k++
   n--
   i++
}
loop 5
{
  mtmp := mtmp a%A_index% ","
}
StringTrimRight, mtmp, mtmp, 1
Sort, mtmp, N D,
Loop, Parse, mtmp, `,
{
    MsgBox, a%A_Index% = %A_LoopField%
}

17 (изменено: Malcev, 2012-11-22 06:00:53)

Re: AHK: Тонкости сортировки.

В общем сделал так.

n = 5
i = 10
k = 1
loop 5
{
   a%k% := n
   list .= n "a" k "`n"
   b%k% := i
   msgbox, % b%k%
   k++
   n--
   i++
}
msgbox % list
Sort, list, N D`n
msgbox % list
list:=RegExReplace(list,"\s*$","")
loop, parse, list, `n, `r
{
   var := (RegExReplace(A_LoopField, "(.+)a", "$2"))
   k := var
   msgbox % b%k%
}