C qsort () vs c ++ sortering ()
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 her . C ++ standardbibliotek gir en lignende funksjonssort () som har sin opprinnelse i STL. Vi har diskutert C ++ Sort her . 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. Sammenligning med Qsort og Sort () 1. Implementeringsdetaljer: Som navnet antyder at Qsort -funksjonen bruker QuickSort -algoritmen for å sortere den gitte matrisen, selv om C -standarden ikke krever at den implementerer Quicksort. C ++ Sorter -funksjon bruker introsort som er en hybridalgoritme. Ulike implementeringer bruker forskjellige algoritmer. GNU Standard C ++ -biblioteket bruker for eksempel en 3-delt hybridsorteringalgoritme: Introsort utføres først (Introsort i seg selv er en hybrid av Quicksort og Heap Sort) etterfulgt av en innsettingssort på resultatet. 2. Kompleksitet: C -standarden snakker ikke om dens kompleksitet av QSORT. Den nye C ++ 11 -standarden krever at kompleksiteten av sortering er O (NLOG (N)) i verste fall. Tidligere versjoner av C ++ som C ++ 03 tillater mulig verste tilfelle av O (N^2). Bare gjennomsnittlig kompleksitet ble nødvendig for å være O (n log n). 3. Løpetid: 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.086125C++ 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. Fleksibilitet: STLs sorter fungerer for alle datatyper og for forskjellige datakontainere som C -matriser C ++ vektorer C ++ deques osv. Og andre containere som kan skrives av brukeren. Denne typen fleksibilitet er ganske vanskelig å oppnå i C. 5. Sikkerhet: Sammenlignet med QSORT er den templerte typen mer typesikkert siden den ikke krever tilgang til dataelementer gjennom utrygge tomromspekere som QSORT gjør. Referanser: http://theory.stanford.edu/~amitp/rants/c++-vs-c/ https://en.wikipedia.org/wiki/sort_(c%2b%2b)