Форум программистов, компьютерный форум, киберфорум
QBasic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/40: Рейтинг темы: голосов - 40, средняя оценка - 4.75
Заблокирован

Quicksort qbasic быстрая сортировка половиной и МЫ

04.05.2018, 22:23. Показов 8925. Ответов 86
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
quicksort qbasic быстрая сортировка половиной и МЫ

на тему сортировка читая дюжину статей
с программами иногда часто вижу ляп:

для А элементов 2 вложенных массива
равные и число перестановок якобы А^2

зато правильнее: I от1 доА и J отI доА
и видимо те ошиблись пиша 1 вместо I
причём часто противореча пояснениям

для А=100 требуется А^2=10ооо ходов
а правильнее =100*(99)/2 =4950 ходов
2-жды меньше видно из формулы

и ещё вникнув в сортировку пополам
получается для А=100
=2*((100/2)*((100/2)-1)/2) = 2450 ходов
4-жды меньше чем советуют по интернету
и возможно реально делить на 4 части и
далее сортируется пузырьковая сортировка

Проведя эксперимент контролируя время
сортируя массив обратный от 100ооо до 1

всё про qb64 компилятор qbasic:
мой пополам 135 секунд и А^2 215 секунд
мой простой 389 секунд и А^2 497 секунд
чужие непонятные около 200 секунд

и вообще предполагаю используя мои строки
контролирующие время реально тестировать
многие алгоритмы сортировки на время
лучше всего массив от 100ооо до 1

и ещё есть методы обмена без доп переменной

В свете вышесказанного: на тему сортировка и МЫ
обнаруживаются остроумные решения
ускоряющие тысячи операций в разы

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

Программу размещаю через тэг code

QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
n = 100
DIM d(n), a(n)
RANDOMIZE TIMER
 
FOR i = 1 TO n
    d(i) = n - i + 1
    PRINT d(i);
NEXT: PRINT: PRINT
 
sumd = 0: suma = 0: x = 0: y = 1: z = 0
 
FOR i = 1 TO n
    sumd = sumd + d(i)
NEXT: sredd = sumd / n
PRINT: PRINT sredd: PRINT
 
FOR i = 1 TO n
    IF d(i) < sredd THEN a(y) = d(i): y = y + 1: ELSE a(n - z) = d(i): z = z + 1
NEXT
 
FOR i = 1 TO n: suma = suma + a(i): NEXT: sreda = suma / n
 
FOR i = 1 TO n / 2: FOR j = i TO n / 2
        IF a(i) > a(j) THEN x = a(i): a(i) = a(j): a(j) = x
NEXT: NEXT
 
FOR i = n / 2 TO n: FOR j = i TO n
        IF a(i) > a(j) THEN x = a(i): a(i) = a(j): a(j) = x
NEXT: NEXT
 
FOR i = 1 TO n: PRINT a(i);: NEXT
PRINT: PRINT: PRINT sreda: PRINT
 
END
любителям сортировки дарю ютюб

0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.05.2018, 22:23
Ответы с готовыми решениями:

If: меньшее из 2-х заданных чисел заменить половиной их суммы, а большее - их удвоенным произведением
Даны действительные числа x,y не равные друг другу.Меньшее из этих чисел заменить половиной их...

Меньшее из двух чисел заменить половиной их суммы
Даны действительные числа х и у, не равные друг другу. Меньшее из этих двух чисел заменить...

Меньшее из двух чисел заменить половиной их суммы, а большее — их удвоенным произведением
Даны действительные числа x и y, не равные друг другу. Меньшее из этих двух чисел заменить...

86
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
31.05.2021, 14:20
Студворк — интернет-сервис помощи студентам
CoderHuligan,
1. Поделитесь кодом продвинутой сортировкой Шелла
2. В коде генерируются одинаковые массивы для каждой сортировки
0
 Аватар для CoderHuligan
1744 / 1009 / 257
Регистрация: 30.06.2015
Сообщений: 5,120
Записей в блоге: 56
31.05.2021, 14:35
Цитата Сообщение от m-ch Посмотреть сообщение
В коде генерируются одинаковые массивы для каждой сортировки
По размерам массивов? Я имел в виду одинаковые значения массивов. И еще надо сравнивать по разным типам наполнения массивов, например первую половину массива заполняем отсортированными значениями, а вторую рэндомными превышающими наибольший отсортированный элемент первой половины, или наоборот. Или массив имеющий возрастающие цепочки и т.п.
Цитата Сообщение от m-ch Посмотреть сообщение
Поделитесь кодом продвинутой сортировкой Шелла
Поделюсь, поделюсь. Работа предстоит не хилая, поэтому не ожидайте быстрого результата.
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
31.05.2021, 15:57
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Я имел в виду одинаковые значения массивов.
Значения в массивах одинаковые в каждой сортировке, за это отвечает Randomize 123 при генерации случайных массивов
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Работа предстоит не хилая, поэтому не ожидайте быстрого результата
Я так полагал, что сортировка Шелла, про которую Вы писали, уже реализована, получается нужно ждать, когда Вы ее реализуете, либо укажите источник, где прописаны способы улучшения сортировки Шелла, при котором она обгоняет QSort на случайных данных
0
 Аватар для CoderHuligan
1744 / 1009 / 257
Регистрация: 30.06.2015
Сообщений: 5,120
Записей в блоге: 56
01.06.2021, 15:08
Цитата Сообщение от m-ch Посмотреть сообщение
Я так полагал, что сортировка Шелла, про которую Вы писали, уже реализована, получается нужно ждать, когда Вы ее реализуете, либо укажите источник, где прописаны способы улучшения сортировки Шелла, при котором она обгоняет QSort на случайных данных
Существуют научные работы, в которых ищутся оптимальные последовательности для шелла. Но я сравнивал сортировку шелла , которая была описана Седжвиком. И сравнение шло со стандартной библиотечной функцией си qsort. Так вот, шелл на неупорядоченных данных обгоняет qsort. Если qsort нужно 17 сек. чтобы отсортировать массив из 10 элементов 30 000 000 раз, то шелл выполняет это за 11 сек.
В то же время самопальная qsort сравнима по времени с шелл сортировкой. На больших массивах надо подбирать оптимальные последовательности, а для этого требуется месяцы работы. пока не могу выделить достаточного времени.
Проверял на Си, так как компилятора FB у меня пока нет, так как с переездами на новые оси, растерял много файлов. Надо еще искать все это хозяйство. А на си проверял так:
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <locale.h>
#define  N 10
#define  T 30000000
int P[N]={3, 1, 8, 3, 9, 1, 3, 2, 10, 9};
int B[N];
int compare(const void * x1, const void * x2)
{
  return ( *(int*)x1 - *(int*)x2 );
}
void swap(int *a, int *b)
{
  int t=*a; *a=*b; *b=t;
}
void q_sort(int arr[], int beg, int end)
{
  if (end > beg + 1)
  {
    int piv = arr[beg], l = beg + 1, r = end;
    while (l < r)
    {
      if (arr[l] <= piv)
        l++;
      else
        swap(&arr[l], &arr[--r]);
    }
    swap(&arr[--l], &arr[beg]);
    q_sort(arr, beg, l);
    q_sort(arr, r, end);
  }
}
void shellsort(int arr[], int l, int r)
{
  int h;
  for(h=1; h<=(r-l)/9; h=3*h+1);
  for(; h>0; h/=3)
    for(int i=l+h; i<=r; i++)
    {
      int j=i; int v = arr[i];
      while(j>=l+h && v<arr[j-h])
      {
        arr[j]=arr[j-h]; j-=h;
      }
      arr[j]=v;
    }
}
int main(void)
{
  setlocale(LC_ALL, "Ru");
  time_t start, end;
  long unsigned t;
  int i;
  srand(time(NULL));
  //for (i=0; i<N; i++)P[i]=rand() % 10 + 1;
  for (i=0; i<N; i++)B[i]=P[i];
  for (i=0; i<N; i++){printf("%d ", B[i]);}puts("");
 
  start = time(NULL);
  for(t=0; t<T; t++)
  {
    for (i=0; i<N; i++)B[i]=P[i];
      //q_sort(B, 0, N);
    qsort(B, N, sizeof(int), compare);
  }
  end = time(NULL);
  printf("Цикл q_sort использовал %d секунд.\n", end-start);
  for (i=0; i<N; i++)printf("%d ", B[i]); puts("");
  start = time(NULL);
  for(t=0; t<T; t++)
  {
    for (i=0; i<N; i++)B[i]=P[i];
      shellsort(B, 0, N);
  }
  end = time(NULL);
  printf("Цикл shellsort использовал %d секунд.\n", end-start);
 for (i=0; i<N; i++)printf("%d ", B[i]);
  return 0;
}
0
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
01.06.2021, 18:24
Лучший ответ Сообщение было отмечено Quiet Snow как решение

Решение

Цитата Сообщение от CoderHuligan Посмотреть сообщение
чтобы отсортировать массив из 10 элементов
Для 10 элементов не рационально использовать QSort, сортировка вставками будет работать быстрее на таком количестве данных

Реализовал 3 варианта сортировки Шелла (с разным набором длины промежутков, в т.ч. и последовательностью предложенной Седжвиком)
В сравнении с модифицированной QSort Шелл все равно проигрывает, хотя последовательность Седжвика ускоряет сортировку
У меня на FB сортировка Шелла более чем в 2 раза медленнее QSort на 20 млн. случайных данных.
При этом при переносе кода на VBA на 1 млн данных Шелл всего на 30% медленнее QSort
Так что многое зависит от ЯП, в котором реализована сортировка, а также от качества компилятора.
Вложения
Тип файла: zip ShellSort.zip (42.5 Кб, 11 просмотров)
2
 Аватар для CoderHuligan
1744 / 1009 / 257
Регистрация: 30.06.2015
Сообщений: 5,120
Записей в блоге: 56
01.06.2021, 18:58
Позже проверю на больших массивах. Раньше пытался проверять, но стандартная qsort ломалась уже на 100000 массиве видимо из-за переполнения программного стека..
0
 Аватар для CoderHuligan
1744 / 1009 / 257
Регистрация: 30.06.2015
Сообщений: 5,120
Записей в блоге: 56
02.06.2021, 16:40
Проверил на массиве из 20 миллионов элементов. Стандартная qsort - 1 сек., шелл - 4 сек., самопальная qsort вообще зациклилась видимо из-за исчерпания стека. Отсортированный массив qsort - 1 сек, шелл - 2. Но опять же стандартная оптимизирована в отличие от шелла. Но у меня нет времени заниматься этим вопросом, как и поиском оптимальных последовательностей. В общем признаю, что на больших массивах qsort рулит.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.06.2021, 16:40
Помогаю со студенческими работами здесь

Не работает QuickSort
Скажем так написал быструю сортировку, вроде по правилам, но как не странно она у меня не...

Выполнить перестановку половины младших разрядов числа на место половины старших разрядов
Помогите решить задачу в Basic Составить программу, которая для задонного целого числа N выполняет...

В построенной таблице выделить числа из первой половины интервала одним цветом, а из второй половины - другим
В общем вот код, но компьютер выдает ошибку, помогите исправить. Вариант 1. Заполнить...

Управление COM-1 портом в QBasic
Никак не пойму как посылать и считывать данные с СОМ-1 порта в QB. Слашал про операторы (функции):...

Задачи QBasic
Задачи по QBasic :huh: 1)В воображаемом квадрате заданного размера построить совокупность n*n...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
87
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru