(fasm) Подскажите алго сортировки unicode строк

Тема в разделе "WASM.ASSEMBLER", создана пользователем nim, 14 окт 2007.

  1. nim

    nim New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2007
    Сообщения:
    10
    сабж
     
  2. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    тут язык и уникод ни при чём - алгоритм универсальный.
    Посмотри в гугле "быструю сортировку" и "метод шелла", а
    то писать долго.
     
  3. nim

    nim New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2007
    Сообщения:
    10
  4. nim

    nim New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2007
    Сообщения:
    10
    мне странно, что на этом сайте в алгоритмах нет ни одной сортировки и в нете тоже не найдешь сортировки на асме, не то что бы на fasm да и вобще нет. Как мне уже подсказали, что видимо сортировка не относится к дзену :).
     
  5. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    nim
    В аттаче пример быстрой сортироки из MASM32;)

    Адоптировать его к fasm и унистрингам думаю будет не сложнее
    чем сделать Ваш вывод:
     
  6. KiNDeR

    KiNDeR New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2003
    Сообщения:
    258
    Адрес:
    Russia
    на основе функции lstrcmpiW, это можно, и достаточно просто, реальзовать!
     
  7. Perre

    Perre New Member

    Публикаций:
    0
    Регистрация:
    6 апр 2007
    Сообщения:
    100
    Я делал так:
    Код (Text):
    1. A – адрес самой маленькая строка (в начале пустая) (строка меньше которой не добавляем)
    2. B – найденная  маленькая строка
    3. C – номер проверяемой строки
    4. D – максимальное количество строк
    5. E – массив в котором будут отсортированные строки
    6. For i = 1 to d
    7.     for C = 1 to d
    8.     If  str (C) > A and str (C) < b then B = str (C) ;если строка на которую указывает С  больше минимальной строки и меньше найденной , тогда делаем её найденной
    9.     Next C
    10.     A=B     ;увеличиваем минимальный предел
    11.     E (i) =  B      ;добавление в массив E номер элемента i строку B
    12. Next i
    13.  
    14. В массиве E имеем отсортированные строки
     
  8. Noble Ghost

    Noble Ghost New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2004
    Сообщения:
    204
    Адрес:
    Russia
    в qsort в качестве функции сравнения подсовывай lstrcmpiW и не парь моск :)
     
  9. ava

    ava New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2003
    Сообщения:
    169
    Алгоритмов сортировки строк множество, и выбор алгоритма не зависит от кодировки текста. Другое дело - алгоритм сравнения строк, зависящий от кодировки:

    UTF-8 (корректный!): рассматриваем строки, как массивы беззнаковых байтов; алгоритм сравнения очевиден;
    UCS-2 / UCS-4 (aka UTF-32): массивы беззнаковых слов/двойных слов; если используется big-endian порядок байтов, то требуется обращение этого порядка (BSWAP r16/r32);
    UTF-16 (то, что обычно и подразумевается под Юникодом): если используются только коды U+0000 - U+FFFF (без суррогатных пар), то алгоритм сравнения такой же, как и для UCS-2; если используются суррогатные пары (для представления кодов U+10000 и выше), то алгоритм сравнения уже сложнее; следуй совету KiNDeR и Noble Ghost.
     
  10. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Noble Ghost
    разве lstrcmpiW __cdecl использует?
     
  11. Noble Ghost

    Noble Ghost New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2004
    Сообщения:
    204
    Адрес:
    Russia
    причем тут cdecl?
    реализуешь функцию любой сортировки на любом языке, но чтобы в качестве параметра умела принимать функцию. и радуешься =)
     
  12. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    про qsort() из CRT подумал :)
     
  13. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    с сортировкой понятно, а вот как с алфавитом? если в строках будут символы, например, украинские или хотя бы "Ё" - как, интересно, lstrcmpiW себя поведет?
     
  14. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Для правильной сортировки с учётом языка нужно использовать CompareString или LCMapString.
    Ещё рекомендую почитать вот эти посты:
    http://blogs.msdn.com/michkap/archive/2005/05/08/415522.aspx
    http://blogs.msdn.com/michkap/archive/2005/05/05/414845.aspx
    http://blogs.msdn.com/michkap/archive/2005/06/24/432121.aspx
     
  15. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    nim
    1) Выбери максимально длинную строку, остальные строки до максимальной длины дополни нулями
    2) сравнивай первые два байта (размер wchar) и сортируешь (хоть пузырьком) строки
    3) если первый юникод-символ совпадает - сравниваем второй wchar и т.д.
    если время критично - используй qsort, сортировку Шелла, пирамидальную сортировку, блочную сортировку
     
  16. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Mikl__
    и кем его(страждуещещего) будут считать после пузырьковой??????
    а 2 и 3 пункт реализованы в
     
  17. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    wsd
    наверное ТС хотел бы готовый сорц на фасме:)
    Я предлагал стандартный путь разобратся с алгоритмом в порядке усложнения: 1) пузырковая 2) шейкерная 3) вставками 4) пирамидальная 5) Шелла 6) Хоора (quick) на примере байтового массива. Потом усложняем до сортировки слов. Далее доходим до сортировки юникод-строк. В конце концов, для вполне упорядоченного списка пузырьком сортируется за время почти O(n) - все дело в объеме сортируемого материала! Если сортировка носит вообще одноразовый характер, можно отсортировать в командной строке "sort unsort.txt > sort.txt" или копировать unicode-строки в Excell и сортировать там. А кем будут считать страждущего это его личное дело...
     
  18. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Mikl__
    это Вы всё таки над ним постустались;)
    это умный-модифик пузырька с флагом отсутствия замен
    а клссический n*n
     
  19. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    wsd
    это худший случай n*(n-1)/2 а до максимальной длины нулями, чтобы не заморачиваться с длиной отсортированных слов, потом можно от лишних нулей избавится:)
     
  20. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Mikl__
    n*n это я для устрашения;)
    и это кол-во сравнений
    а ещё перестановок
    3/4(n*n-n) средний
    3/2(n*n-n) худший