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

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

04.05.2018, 22:23. Показов 9303. Ответов 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
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 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
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 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
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
01.06.2021, 18:58
Позже проверю на больших массивах. Раньше пытался проверять, но стандартная qsort ломалась уже на 100000 массиве видимо из-за переполнения программного стека..
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru