C qsort () против C ++ sort ()
Стандартная библиотека C предоставляет функцию qsort, которую можно использовать для сортировки массива. Ниже приведен прототип функции qsort ().
// Сортируем массив любого типа. Параметры, базовые // адрес массива, размер массива и указатель на // функция компаратора void qsort (void * base, size_t num, size_t size, int (* компаратор) (const void *, const void *));
Для этого требуется указатель на массив, количество элементов в массиве, размер каждого элемента и функция компаратора. Мы подробно обсудили здесь компаратор qsort.
Стандартная библиотека C ++ предоставляет аналогичную функцию sort (), которая возникла в STL. Мы обсудили здесь сортировку C ++. Ниже приведены прототипы функции sort () C ++.
// Сортировать по умолчанию или по возрастанию. шаблонпустая сортировка (Т первая, Т последняя); // Сортировать в соответствии с указанным порядком // по комп. шаблон void sort (T first, T last, Compare comp);
Сохранение порядка равных элементов не гарантируется. C ++ предоставляет std :: stable_sort, который можно использовать для сохранения порядка.
Сравнение с qsort и sort ()
1. Детали реализации:
Как следует из названия, функция qsort использует алгоритм QuickSort для сортировки данного массива, хотя стандарт C не требует, чтобы он реализовывал быструю сортировку.
Функция сортировки C ++ использует внутреннюю сортировку, которая является гибридным алгоритмом. В разных реализациях используются разные алгоритмы. Библиотека GNU Standard C ++, например, использует трехкомпонентный гибридный алгоритм сортировки: сначала выполняется внутренняя сортировка (сама внутренняя сортировка является гибридом быстрой сортировки и сортировки кучей), а затем сортировка вставкой по результату.
2. Сложность:
Стандарт C не говорит о сложности qsort. Новый стандарт C ++ 11 требует, чтобы сложность сортировки в худшем случае составляла O (Nlog (N)). Предыдущие версии C ++, такие как C ++ 03, допускают наихудший сценарий O (N ^ 2). Только средняя сложность должна была быть O (N log N).
3. Продолжительность:
Сортировка STL выполнялась быстрее, чем qsort C, потому что шаблоны C ++ генерируют оптимизированный код для определенного типа данных и конкретной функции сравнения.
Сортировка в STL выполняется на 20–50% быстрее, чем ручная сортировка, и на 250–1000% быстрее, чем функция библиотеки C qsort. C может быть самым быстрым языком, но qsort очень медленный.
Когда мы пытались отсортировать один миллион целых чисел на C ++ 14, время, затраченное C qsort (), составляло 0,247883 секунды, а время, затраченное C ++ sort (), составляло всего 0,086125 секунды.
// C++ program to demonstrate performance of // C qsort and C++ sort() algorithm #include <bits/stdc++.h> using namespace std; // Number of elements to be sorted #define N 1000000 // A comparator function used by qsort int compare( const void * a, const void * b) { return ( *( int *)a - *( int *)b ); } // Driver program to test above functions int main() { int arr[N], dupArr[N]; // seed for random input srand ( time (NULL)); // to measure time taken by qsort and sort clock_t begin, end; double time_spent; // generate random input for ( int i = 0; i < N; i++) dupArr[i] = arr[i] = rand ()%100000; begin = clock (); qsort (arr, N, sizeof ( int ), compare); end = clock (); // calculate time taken by C qsort function time_spent = ( double )(end - begin) / CLOCKS_PER_SEC; cout << "Time taken by C qsort() - " << time_spent << endl; time_spent = 0.0; begin = clock (); sort(dupArr, dupArr + N); end = clock (); // calculate time taken by C++ sort time_spent = ( double )(end - begin) / CLOCKS_PER_SEC; cout << "Time taken by C++ sort() - " << time_spent << endl; return 0; } |
Выход :
Время, затраченное C qsort () - 0.247883 Время, затраченное C ++ sort () - 0,086125
С ++ sort () невероятно быстрее, чем qsort () для эквивалентных данных из-за встраивания. sort () в контейнере целых чисел будет скомпилирован для использования std :: less 4. Гибкость: 5. Безопасность: Использованная литература: Эта статья предоставлена Адитьей Гоэлем . Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью и отправить ее по электронной почте на deposit@geeksforgeeks.org. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам. Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше. Вниманию читателя! Не прекращайте учиться сейчас. Освойте все важные концепции DSA с помощью самостоятельного курса DSA по доступной для студентов цене и будьте готовы к работе в отрасли. Получите все важные математические концепции для соревновательного программирования с курсом Essential Maths for CP по доступной для студентов цене. Если вы хотите посещать живые занятия с отраслевыми экспертами, пожалуйста, обращайтесь к Geeks Classes Live и Geeks Classes Live USA.
Сортировка STL работает для всех типов данных и для различных контейнеров данных, таких как массивы C, векторы C ++, deques C ++ и т. Д. И другие контейнеры, которые могут быть написаны пользователем. Такой гибкости довольно сложно добиться в C.
По сравнению с qsort, шаблонная сортировка более безопасна по типу, поскольку не требует доступа к элементам данных через небезопасные указатели void, как это делает qsort.
http://theory.stanford.edu/~amitp/rants/c++-vs-c
https://en.wikipedia.org/wiki/Sort_(C%2B%2B)