Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.78/37: Рейтинг темы: голосов - 37, средняя оценка - 4.78
14 / 14 / 4
Регистрация: 08.10.2009
Сообщений: 114

Поиск самой быстрой сортировки

13.07.2010, 23:42. Показов 7772. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ищу быструю реализацию быстрого алгоритма сортировки массива для среднего случая на С/С++ под Win32. Остальные параметры не имеют значения.
Пока что самая быстрая реализация которую я нашел - простой quicksort из книги Седжвика.
Вот прога, где реализована быстрая сортировка :

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
#include<algorithm>
#include<stdlib.h>
#include<time.h>
#include<iostream>
#include<stack>
using namespace std;
 
 
template <class Item>
void quicksort(Item a[], int l, int r)
  {
    if (r <= l) return;
    int i = partition(a, l, r);
    quicksort(a, l, i-1);
    quicksort(a, i+1, r);
  }
 
template <class Item>
int partition(Item a[], int l, int r)
{ 
    int i = l-1, j = r; Item v = a[r];
    for (;;)
      { 
        while (a[++i] < v) ;
        while (v < a[--j]) if (j == l) break;
        if (i >= j) break;
        Item t = a[i]; a[i] = a[j]; a[j] = t; 
      }
     Item t = a[i]; a[i] = a[r]; a[r] = t; 
    return i;
}
 
 
int main()
{
    srand(time(0));
    const int count = 1000000;
    int* a = new int [count];
 
    for(int i = 0; i < count; ++i)
    a[i] = rand();
    
    clock_t begin = clock();
    quicksort(a, 0, count - 1);
    clock_t end = clock();
    cout <<  (double)(end - begin)/CLOCKS_PER_SEC << endl;
 
    int first = 500; 
    cout << "First 500 elements: " << endl;
    for(int i = 0; i < 500; ++i)
        cout << a[i] << ' '; 
    return 0;     
}
У меня на машине Athlon XP 1.66 GHz на Visual Studio 9.0, XP3 эта реализация quicksort сортирует элементы int за 0,68... сек.
Если кто-то имеет более быструю реализацию - киньте код или ссылку, пожалуйста.
Кстати под .Net List.Sort() для int коллекции делает эту работу за 0,2 сек !
Хотелось бы достичь такого результата под виндой на вышеописаной конфигурации без использования стандартных функций С/С++ на языке С/С++/С#.

Добавлено через 20 минут
Если заюзать оптимизацию в опциях компилятора для этого кода - время: 0,23 сек !
Можна ли быстрее ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.07.2010, 23:42
Ответы с готовыми решениями:

Пример быстрой сортировки массива строк и сортировки методом выбора
Добрый вечер. Скиньте пожалуйста пример быстрой сортировки массива строк и сортировки массива строк методом выбора. Очень срочно надо,...

Метод быстрой сортировки
Доброго времени суток, форумчане. Вчера проходили метод быстрой сортировки. Во входном файле в первой строчке указывается кол-во...

Не алгоритм быстрой сортировки
Просто как подключить эту функцию Не работаеееет #include&lt;iostream&gt; #include&lt;iomanip&gt; #include &lt;algorithm&gt; using namespace...

21
14 / 14 / 4
Регистрация: 08.10.2009
Сообщений: 114
20.07.2010, 00:03  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от HIMen Посмотреть сообщение
Sich_Taras, вот самая быстрая что у меня получалась
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
#include "stdafx.h"
using namespace System;
const int Q = 30;
void QuickAndInsertSort(array<int>^);
void insertSort(int*, int, int);
void recQuickAndInsertSort(int*, int, int);
void QuickAndInsertSort(array<int>^ arr)
{
    if (arr->Length < Q)
    {
        pin_ptr<int> ptr = &arr[0];
        insertSort(ptr, 0, arr->Length - 1);
    }
    else
    {
        pin_ptr<int> ptr = &arr[0];
        recQuickAndInsertSort(ptr, 0, arr->Length - 1);
    }
}
void insertSort(int* arr, int first, int last)
{
    int j;
    int index;
    for (int i = first; i < last + 1; i++)
    {
        index = arr[i];
        j = i;
        while ((j > 0) && (arr[j - 1] > index))
        {
            arr[j] = arr[j - 1];
            j = j - 1;
        }
        arr[j] = index;
    }
}
void recQuickAndInsertSort(int* arr, int first, int last)
{
    int p = arr[((last - first) >> 1) + first];
    int temp;
    int i = first, j = last;
    while (i <= j)
    {
        while (arr[i] < p && i <= last) i++;
        while (arr[j] > p && j >= first) j--;
        if (i <= j)
        {
            temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
            i++;
            j--;
        }
    }
    if (j - first - Q > 0) recQuickAndInsertSort(arr, first, j);
    else if (j - first > 0) insertSort(arr, first, j);
    if (i - last + Q < 0) recQuickAndInsertSort(arr, i, last);
    else if (i - last < 0)insertSort(arr, i, last);
}
int main()
{
    auto r = gcnew Random(DateTime::Now.Millisecond);
    auto msv = gcnew array<int>(10000000);
    for each (auto% i in msv)
    {
        i = r->Next(int::MinValue, int::MaxValue);
    }
    auto t = DateTime::Now;
    QuickAndInsertSort(msv);
    Console::WriteLine(DateTime::Now - t);
    Console::ReadLine();
    return 0;
}
Рекурсивная быстрая + вставками на малых массивах, под .NET, c использованием управляемых массивов в куче и доступом к элементам через указатель
10^7 элементов от int::MinValue до int::MaxValue в среднем 1.4 секунды
Я протестировал в среднем 1,96 против 2.434 сек, новый рекорд !!!
Молодец HIMen !!! Вот это я понимаю, спасибо !

Добавлено через 4 минуты
А если заюзать полную оптимизацию в среднем: 00:00:01.5522320 сек !!!!
0
xacmajib
28.09.2011, 13:23
www.sorting-algorithms.com
И тему можно закрыть.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.09.2011, 13:23

Алгорим быстрой сортировки
В одной из тем выложен алгоритм быстрой сортировки. Возник вопрос: если индексы i и j указывают на один элемент зачем нужен обмен? ...

Алгоритм Быстрой Сортировки на C++
Можно ли этот алгоритм использовать для последовательности чисел? Просто в книге Сэджвика &quot;Фундаментальные алгоритмы на C++&quot;...

Визуализатор быстрой сортировки
Добрый день! Нужно написать программу, которая иллюстрирует работу быстрой сортировки. В частности должно присутствовать: *вывод...

Тонкости быстрой сортировки
Излазил кучу мест в сети. Нашел массу этих алгоритмов, но на поверку практически каждый не совсем работающий. Представляется, что в этой...

Иллюстрация быстрой сортировки
Ребят,необходимо написать программу похожую на ту,которая тут https://www.cyberforum.ru/csharp-beginners/thread874724.html Помогите...


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

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
Эксперимент с картинкой-обложкой на CodinGame
Adler 10.07.2026
Решил на днях провести эксперимент. У меня есть аккаунт на CodinGame, ТОП-3 по РФ среди 2200 участников (в разделе соревнования по программированию ИИ-ботов). Там есть обложка, куда можно влепить. . .
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru