Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 5 из 5

Тема: Pawn.Sort

  1. #1
    Аватар для Tornamic
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.09.2023
    Адрес
    Сновск
    Сообщений
    3
    Репутация:
    0 ±

    Pawn.Sort

    Автор: Tornamic (я)
    Текущая версия: 2

    Описание:
    • Алгоритмы сортировки для Pawn


    Список алгоритмов:
    • Сортировка пузырьком (Bubble sort)
    • Сортировка выбором (Selection sort)
    • Сортировка вставками (Insertion sort)
    • Гномья сортировка (Gnome sort)
    • Шейкерная сортировка (Shaker/Cocktail sort)
    • Сортировка чет-нечет (Odd-even Sort)
    • Быстрая сортировка (Quick sort)
    • Пирамидальная сортировка (Heap sort)
    • Сортировка шелла (Shell sort)
    • Случайная сортировка (Bogo sort)


    Скорость алгоритмов (меньше - лучше):
    • Quick sort: 4
    • Shell sort: 5
    • Heap sort: 9
    • Insertion sort: 12
    • Selection sort: 14
    • Shaker sort: 25
    • Gnome sort: 27
    • OddEven sort: 28
    • Bubble sort: 44
    • Bogo sort: Infinity


    Установка:
    1. #include <Pawn.Sort>


    Пример:
    1. main()
    2. {
    3. new array[100];
    4. Array::FillRandomValues(array);
    5. print("Bubble sort:");
    6. Sort::Bubble(array);
    7. Array::Print(array);
    8. }


    1. Copyright © 2023 Tornamic. All rights reserved.
    2.  
    3. Author: Tornamic (Kirill Tymoshchenko)
    4. Discord: https://pastebin.com/raw/LMBNfFHE
    5. Github: https://github.com/Tornamic
    6. pawn.wiki https://pawn.wiki/i.php?/user/54232-tornamic/
    7.  
    8.  
    9. # Quadratic Sort Functions
    10. Sort::Bubble(array[], const len = sizeof array) https://en.wikipedia.org/wiki/Bubble_sort
    11. Sort::Selection(array[], const len = sizeof array) https://en.wikipedia.org/wiki/Selection_sort
    12. Sort::Insertion(array[], const len = sizeof array) https://en.wikipedia.org/wiki/Insertion_sort
    13. Sort::Gnome(array[], const len = sizeof array) https://en.wikipedia.org/wiki/Gnome_sort
    14. Sort::Shaker(array[], len = sizeof array) https://en.wikipedia.org/wiki/Cocktail_shaker_sort
    15. Sort::OddEven(array[], const len = sizeof array) https://en.wikipedia.org/wiki/Odd%E2%80%93even_sort
    16.  
    17. # Logarithmic Sort Functions
    18. Sort::Quick(array[], left, right) https://en.wikipedia.org/wiki/Quicksort
    19. Sort::Heap(array[], const len = sizeof array) https://en.wikipedia.org/wiki/Heapsort
    20. Sort::Shell(array[], const len = sizeof array) https://en.wikipedia.org/wiki/Shellsort
    21.  
    22. # Weird Sort Functions
    23. Sort::Bogo(array[], const len = sizeof array) https://en.wikipedia.org/wiki/Bogosort
    24.  
    25. # Misc Functions
    26. Var::Swap(&value1, &value2)
    27. Array::FillRandomValues(array[], const len = sizeof array, randmin = -10000, randmax = 10000)
    28. Array::Print(array[], const len = sizeof array)
    29. Array::Shuffle(array[], const len = sizeof array)
    30. Array::IsSorted(const array[], const len = sizeof array)


    Скачать:
    Последний раз редактировалось Tornamic; 11.09.2023 в 20:33.

  2. #2
    Аватар для punkochel
    Пользователь

    Статус
    Оффлайн
    Регистрация
    08.12.2018
    Адрес
    Россия
    Сообщений
    146
    Репутация:
    25 ±
    Молодец, хорошая работа, структурированного инклуда по данной теме не встречал.
    Желательно изменить название функции Shuffle, ибо она не перемешивает массив, а заполняет его. Правильно было бы назвать эту функцию вроде FillRandomValues, или что-то в этом роде, а название Shuffle использовать для функции, которая бы перемешивала значения которые уже находятся в массиве (это будет весьма полезно для создания карточных игр: дурак / покер).

    Цитата Сообщение от Tornamic Посмотреть сообщение
    Скорость алгоритмов (меньше - лучше):
    • Quick sort: 4
    • Shell sort: 5
    • Heap sort: 9
    • Insertion sort: 12
    • Selection sort: 14
    • Shaker sort: 25
    • Gnome sort: 27
    • OddEven sort: 28
    • Bubble sort: 44
    Тут стоит указать как проводилось тестирование и откуда такие значения взялись.

    Имхо... в Pawn нет необходимости использовать алгоритмы сортировок отличные от сортировки выбором.

  3. #3
    Аватар для Tornamic
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.09.2023
    Адрес
    Сновск
    Сообщений
    3
    Репутация:
    0 ±
    К совету с перемешиванием прислушаюсь.
    Вот код проверки, самый простой, который только есть

    1. new array[100];
    2. new time1 = gettime();
    3. print("Bubble sort:");
    4. for(new i = 0; i < 100000; i++)
    5. {
    6. Array::Shuffle(array);
    7. Sort::Bubble(array);
    8. }
    9. printf("%i", gettime() - time1);

  4. #4
    Аватар для Tornamic
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.09.2023
    Адрес
    Сновск
    Сообщений
    3
    Репутация:
    0 ±
    Обновил до версии 2

  5. #5
    Аватар для punkochel
    Пользователь

    Статус
    Оффлайн
    Регистрация
    08.12.2018
    Адрес
    Россия
    Сообщений
    146
    Репутация:
    25 ±
    Цитата Сообщение от Tornamic Посмотреть сообщение
    К совету с перемешиванием прислушаюсь.
    Вот код проверки, самый простой, который только есть

    1. new array[100];
    2. new time1 = gettime();
    3. print("Bubble sort:");
    4. for(new i = 0; i < 100000; i++)
    5. {
    6. Array::Shuffle(array);
    7. Sort::Bubble(array);
    8. }
    9. printf("%i", gettime() - time1);
    Это не будет давать верные результаты скорости. Array::Shuffle(array) тут заполняет массив рандомными значениями, как я понимаю, и каждый раз эти значения будут отличаться, и каждый раз из-за этого время на сортировку будет разное.
    Я тут набросал пример профайлера, если будет время постарайся провести тесты:
    1. #define ARRAY_SIZE 1000
    2.  
    3. new array[ARRAY_SIZE];
    4. new bool:flag_fill_array;
    5.  
    6. stock TestSortSpeed(index)
    7. {
    8. if(!flag_fill_array) {
    9. Array::FillRandomValues(array);
    10. flag_fill_array = true;
    11. }
    12. new time_count,
    13. sort_name[32+1],
    14. temp_arr[ARRAY_SIZE];
    15. temp_arr = array;
    16.  
    17. time_count = GetTickCount();
    18. switch(index) {
    19. case 0: {
    20. sort_name = "Bubble";
    21. Array::Bubble(temp_arr);
    22. }
    23. case 1: {
    24. sort_name = "Selection";
    25. Array::Selection(temp_arr);
    26. }
    27. /*
    28.   etc, for each method
    29.   */
    30. }
    31. printf("Sort method: '%s' / Time: %d ms", sort_name, GetTickCount() - time_count);
    32. }

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •