Сортировка по алфавиту

Anything and all.

Moderators: Murderator+, Murderator

korzh
Posts: 220
Joined: 2007-04-26 23:35:15

Сортировка по алфавиту

Post by korzh »

Есть у кого-нибудь идеи как сделать сортировку выводимых значений по алфавиту?
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

А в чём собственно говоря проблема ?

Хвать алгоритму и вперёд :) Будь бы ещё в инже такой хитрый функций, как ord() - вообще быстро бы работало :)

PS: Если не усну, попробую что-нибудь из головы выдумать :)
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Telegram: @tatikom
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Не уснул - выдумал с ходу какую-то хреновину, теоретически - должна работать :)

Code: Select all

sub main()
	var i, len = 3
	DIM arr[val( str( len ) )]
	arr[0] = "Abc";
	arr[1] = "123"
	arr[2] = "1230"
	sort( arr, len )
	for i = 0 to len -1
		uo.print( arr[ i ] )
	next
end sub

Sub sort( arr, len )
	var i, j, r, temp
	for i = 1 to len -1
		j = i
		while j > 0
			r = getAlphaWord( arr[ j ], arr[ j - 1 ] )
			if r == 1 then
				temp = arr[ j ]
				arr[ j ] = arr[ j - 1 ]
				arr[ j - 1 ] = temp
				j = j - 1
			else
				j = 0
			endif
		wend
	next
EndSub

Sub getAlphaWord( word1, word2 )
	var i, r, len = strlen( word1 )
	if strlen( word1 ) > strlen( word2 ) then
		len = strlen( word2 )
	endif
	for i = 0 to len -1
		r = getAlphaSym( word1[ i ], word2[ i ] )
		if not r == 0 then
			return r
		endif
	next
	if strlen( word2 ) > strlen( word1 ) then
		return 1
	endif
	if strlen( word1 ) > strlen( word2 ) then
		return 2
	endif
	return 0
EndSub

Sub getAlphaSym( sym1, sym2 )
	var i, alpha = "0123456789"
	alpha = alpha + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
	alpha = alpha + "abcdefghijklmnopqrstuvwxyz"
	alpha = alpha + "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
	alpha = alpha + "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"
	if sym1 == sym2 then
		return 0
	endif
	for i = 0 to strlen( alpha ) -1
		if alpha[ i ] == sym1 then
			return 1
		endif
		if alpha[ i ] == sym2 then
			return 2
		endif
	next
	return 0
EndSub
Старался действовать наиболее оптимально, но особо большие тексты я бы кормить этой штуке не рекомендовал :)
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Telegram: @tatikom
Grin
Expert!
Posts: 2580
Joined: 2005-05-04 14:05:19
Location: Москва

Post by Grin »

самое простое что можно с инжой сделать это с делать для слов второй масив который будет содержать их цифровой эквивалент.
много слов то?
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Grin wrote:самое простое что можно с инжой сделать это с делать для слов второй масив который будет содержать их цифровой эквивалент.
много слов то?
А чем код выше тебе не по душе ?)

И массив не надо - в строчку читабельнее..

Хотя, как вариант:

Code: Select all

DIM alpha[ 256 ]
for i = 0 to 255
    alpha[ i ] = chr( i )
next
Винда примерно так и сортирует вроде :)
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Telegram: @tatikom
korzh
Posts: 220
Joined: 2007-04-26 23:35:15

Post by korzh »

Destruction wrote:Не уснул - выдумал с ходу какую-то хреновину, теоретически - должна работать :)

Старался действовать наиболее оптимально, но особо большие тексты я бы кормить этой штуке не рекомендовал :)
Спасибо, попробую сейчас, отпишусь :)

А слов 100-200 гдето)
Grin
Expert!
Posts: 2580
Joined: 2005-05-04 14:05:19
Location: Москва

Post by Grin »

Destruction wrote: А чем код выше тебе не по душе ?)

И массив не надо - в строчку читабельнее..
я писал пост еще твоего не было;)
а то что ты написал в принципе ничего лутше не придумать, напильником если только обработать (код можно сократить)...
все равно так или иначе надо будет сравнивать по символьно...
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Grin wrote:
Destruction wrote: А чем код выше тебе не по душе ?)

И массив не надо - в строчку читабельнее..
я писал пост еще твоего не было;)
а то что ты написал в принципе ничего лутше не придумать, напильником если только обработать (код можно сократить)...
все равно так или иначе надо будет сравнивать по символьно...
Ну, как вариант - можно забивать массивчик через chr(), как я предложил выше, но тут у меня дай боже - 100 символов, а то будет 256 - упадёт производительность :)

А касательно напильника - работай, если хочешь - я не спец по сортировкам, я просто написал самое логичное, что пришло в голову :)

И про сокращение кода не спорю - вот например переменная r там нафиг не сдалась ))
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Telegram: @tatikom
korzh
Posts: 220
Joined: 2007-04-26 23:35:15

Post by korzh »

Идею уловил, вроде работает. Только проблемка осталась, как отсортировать переменные не из массива, а из ини файла?
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

korzh wrote:Идею уловил, вроде работает. Только проблемка осталась, как отсортировать переменные не из массива, а из ини файла?
Считать ini-файл в массив, отсортировать, сохранить обратно.

Ффсё, файл отсортирован :)

А вообще - пиши по-русски, а то обижусь и уйду из топика :evil:
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Telegram: @tatikom
korzh
Posts: 220
Joined: 2007-04-26 23:35:15

Post by korzh »

ну это то понятно, только при каждом добавлении чего то нового в ини файл придеться лезть в скрипт и дописывать массив..
korzh
Posts: 220
Joined: 2007-04-26 23:35:15

Post by korzh »

а пля
можно проще, написать функцию генерации массива из ини файла, а то я чтото подумал что ты имел ввиду руками вбивать :roll:
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

korzh wrote:а пля
можно проще, написать функцию генерации массива из ини файла, а то я чтото подумал что ты имел ввиду руками вбивать :roll:
Оно тебе точно надо?...

PS: А такой способ сортировки вроде пузырьковым называется.. помню года 4 назад где-то читал.. :)
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Telegram: @tatikom
korzh
Posts: 220
Joined: 2007-04-26 23:35:15

Post by korzh »

Да я тоже вспонмил, в начале семестра было, после каникул все забыл :(
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

korzh wrote:Да я тоже вспонмил, в начале семестра было, после каникул все забыл :(
В общем всё, вопрос исчерпан.

Всё, что тебе по-сути надо - это функция getAlphaWord, которая вычисляет, которая строка наиболее "алфавитная" :)

Так, что юзай как заблагорассудится. Алгоритм пузырьков непосредственно в ф-ции sort().

Всё просто и удобно :)
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Telegram: @tatikom
Grin
Expert!
Posts: 2580
Joined: 2005-05-04 14:05:19
Location: Москва

Post by Grin »

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

кода прилично меньше будет. да и перебор букв можно уменьшить.
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Простым смертным, вроде меня, твои слова ничего не говорят.

Возьми да сделай, а я уж на код погляжу :)

Вспоминается ситуация, с моим автоламбером, когда я выдумывал алгоритму для поиска ближайшего дерева, а мне Edred говорил в каждом посте, что я еретик (ну примерно так, дословно не помню, перечитывать лень).. :)
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Telegram: @tatikom
Grin
Expert!
Posts: 2580
Joined: 2005-05-04 14:05:19
Location: Москва

Post by Grin »

агоритм что утебя не класический пузырек, а модернизированый;)
korzh
Posts: 220
Joined: 2007-04-26 23:35:15

Post by korzh »

Вообщем сделал, спасибо ;)
korzh
Posts: 220
Joined: 2007-04-26 23:35:15

Post by korzh »

оказалось не до конца сделал :(
Сортируется только один параметр, как связать с ним остальные?
Post Reply