logo

C qsort () vs c ++ sort ()

Standard C library provides qsort function that can be used for sorting an array. Following is the prototype of qsort() function.
// Sort an array of any type. The parameters are base // address of array size of array and pointer to // comparator function void qsort (void* base size_t num size_t size int (*comparator)(const void* const void*));
It requires a pointer to the array the number of elements in the array the size of each element and a comparator function. We have discussed qsort comparator in detail هنا . توفر مكتبة C ++ القياسية نوعًا مماثلًا للوظيفة () التي نشأت في STL. لقد ناقشنا نوع C ++ هنا . Following are prototypes of C++ sort() function.
// To sort in default or ascending order. template void sort(T first T last); // To sort according to the order specified // by comp. template void sort(T first T last Compare comp); 
The order of equal elements is not guaranteed to be preserved. C++ provides std::stable_sort that can be used to preserve order. مقارنة مع qsort و sort () 1. تفاصيل التنفيذ: كما يوحي الاسم ، تستخدم وظيفة QSort خوارزمية Quicksort لفرز الصفيف المحدد على الرغم من أن معيار C لا يتطلب ذلك لتنفيذ Quicksort. تستخدم وظيفة فرز C ++ introsort وهي خوارزمية هجينة. تستخدم التطبيقات المختلفة خوارزميات مختلفة. تستخدم مكتبة C ++ القياسية GNU على سبيل المثال خوارزمية فرز هجينة من 3 أجزاء: يتم تنفيذ introsort أولاً (introsort نفسها كونها هجينة من subsor Quicksort و Cheap) تليها نوع الإدراج على النتيجة. 2. التعقيد: المعيار C لا يتحدث عن تعقيد QSort. يتطلب معيار C ++ 11 الجديد أن يكون التعقيد من الفرز O (nlog (n)) في أسوأ الحالات. تتيح الإصدارات السابقة من C ++ مثل C ++ 03 سيناريو الحالة المحتملة لـ O (n^2). كان هناك حاجة فقط إلى متوسط ​​التعقيد ليكون O (n log n). 3. وقت التشغيل: STL’s sort ran faster than C’s qsort because C++’s templates generate optimized code for a particular data type and a particular comparison function. STL’s sort runs 20% to 50% faster than the hand-coded quicksort and 250% to 1000% faster than the C qsort library function. C might be the fastest language but qsort is very slow. When we tried to sort one million integers on C++14 Time taken by C qsort() was 0.247883 sec and time taken by C++ sort() was only 0.086125 sec CPP
// C++ program to demonstrate performance of // C qsort and C++ sort() algorithm #include    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; } 
Output :
Time taken by C qsort() - 0.247883 Time taken by C++ sort() - 0.086125 
C++ sort() is blazingly faster than qsort() on equivalent data due to inlining. sort() on a container of integers will be compiled to use std::less::operator() by default which will be inlined and sort() will be comparing the integers directly. On the other hand qsort() will be making an indirect call through a function pointer for every comparison which compilers fails to optimize. 4. المرونة: يعمل نوع STL لجميع أنواع البيانات وللحاويات المختلفة للبيانات مثل C ++ Vectors C ++ Deques وغيرها وحاويات أخرى يمكن أن يكتبها المستخدم. من الصعب تحقيق هذا النوع من المرونة في C. 5. السلامة: بالمقارنة مع QSort ، يكون النوع templated أكثر آمنة من النوع لأنه لا يتطلب الوصول إلى عناصر البيانات من خلال مؤشرات باطلة غير آمنة كما تفعل QSort. مراجع: http://theory.stanford.edu/~amitp/rants/c+-vs-c/ https://en.wikipedia.org/wiki/sort_(c٪2b٪2b)