kzru_hunter
Осваивающий
- Сообщения
- 144
- Репутация
- 49
Вообщем, задан упорядоченный массив. Значения могут быть разные.
В этот массив я хочу вставить значение, но так чтобы массив остался упорядоченным.
Для этого нужно найти позицию в массиве, в которую нужно вставить элемент с заданным значением. Причём, если в массиве уже есть несколько элементов с таким же значением, то элемент нужно вставить после всех этих элементов.
Поиск нужно производить с заданной позиции в массиве и с заданным направлением.
Примечание: в 70-90% случаев нужная позиция будет находится рядом с позицией, с которой будет производится поиск. Поэтому метод деления пополам оставлю на крайний случай.
Есть на примете алгоритм, но никак не получается его сделать полностью рабочим: к заданной позиции прибавляем или убавляем сначала 1, потом 2, 4, 8 и т.д. в зависимости от направления и сравниваем значения, пока не найдем нужную позицию.
Вот код, который никак не получается сделать полностью рабочим:
Код:
Dim $OrderedArray[10000]
For $i=1 to 9999
$OrderedArray[$i] = 10000 - $i
Next
В этот массив я хочу вставить значение, но так чтобы массив остался упорядоченным.
Для этого нужно найти позицию в массиве, в которую нужно вставить элемент с заданным значением. Причём, если в массиве уже есть несколько элементов с таким же значением, то элемент нужно вставить после всех этих элементов.
Поиск нужно производить с заданной позиции в массиве и с заданным направлением.
Примечание: в 70-90% случаев нужная позиция будет находится рядом с позицией, с которой будет производится поиск. Поэтому метод деления пополам оставлю на крайний случай.
Есть на примете алгоритм, но никак не получается его сделать полностью рабочим: к заданной позиции прибавляем или убавляем сначала 1, потом 2, 4, 8 и т.д. в зависимости от направления и сравниваем значения, пока не найдем нужную позицию.
Вот код, который никак не получается сделать полностью рабочим:
Код:
#include <array.au3>
Dim $OrderedArray[10000]
For $i=1 to 9999
$OrderedArray[$i] = 10000 - $i
Next
ConsoleWrite("value = " & $i & ", pos = " & _FindPos(3000, 10000) & @CRLF)
Func _FindPos($points, $pos)
$direction = False ; направление
$step = 1 ; шаг
$count = 0 ; количество проходов
While 1
If not $direction Then
$pos -= $step
If $pos > 1 Then
If $OrderedArray[$pos] < $points Then
$count += 1
$step += $step
ConsoleWrite("$pos = " & $pos & @CRLF)
ContinueLoop
Else
If $step = 1 Then
ConsoleWrite("$count = " & $count+1 & @CRLF)
return $pos+1
EndIf
$direction = True
$step = 1
EndIf
Else
If $OrderedArray[$pos] >= $points Then
$direction = True
$step = 1
Else
ConsoleWrite("$count = " & $count+1 & @CRLF)
return 1
EndIf
EndIf
Else
$pos += $step
If $OrderedArray[$pos] >= $points Then
$count += 1
$step += $step
ConsoleWrite("$pos = " & $pos & @CRLF)
ContinueLoop
Else
If $step = 1 Then
ConsoleWrite("$count = " & $count+1 & @CRLF)
return $pos
EndIf
$direction = False
$step = 1
EndIf
EndIf
$count += 1
WEnd
EndFunc