std::sort() v C++ STL

Diskutovali sme qsort() v C. C++ STL poskytuje podobné triedenie funkcií, ktoré triedi vektor alebo pole (položky s náhodným prístupom)

Vo všeobecnosti sú potrebné dva parametre, prvý je bod poľa/vektora, od ktorého sa má triedenie začať, a druhý parameter je dĺžka, do ktorej chceme pole/vektor zoradiť. Tretí parameter je voliteľný a možno ho použiť v prípadoch, keď chceme prvky triediť lexikograficky.

Funkcia sort() štandardne triedi prvky vo vzostupnom poradí.

Nižšie je uvedený jednoduchý program, ktorý ukazuje fungovanie sort().

CPP




// C++ program to demonstrate default behaviour of> // sort() in STL.> #include> using> namespace> std;> int> main()> {> > int> arr[] = { 1, 5, 8, 9, 6, 7, 3, 4, 2, 0 };> > int> n => sizeof> (arr) /> sizeof> (arr[0]);> > /*Here we take two parameters, the beginning of the> > array and the length n upto which we want the array to> > be sorted*/> > sort(arr, arr + n);> > cout < <> ' Array after sorting using '> > 'default sort is : '> ;> > for> (> int> i = 0; i cout < < arr[i] < < ' '; return 0; }>

Výkon

Array after sorting using default sort is : 0 1 2 3 4 5 6 7 8 9 

Časová zložitosť: O(N log N)
Pomocný priestor: O(1)

Ako triediť v zostupnom poradí?
sort() preberá tretí parameter, ktorý sa používa na určenie poradia, v ktorom sa majú prvky triediť. Funkciu Väčšie () môžeme odovzdať na zoradenie v zostupnom poradí. Táto funkcia robí porovnanie spôsobom, ktorý dáva väčšie prvky pred.

CPP




// C++ program to demonstrate descending order sort using> // greater().> #include> using> namespace> std;> int> main()> {> > int> arr[] = { 1, 5, 8, 9, 6, 7, 3, 4, 2, 0 };> > int> n => sizeof> (arr) /> sizeof> (arr[0]);> > sort(arr, arr + n, greater <> int> >());> > cout < <> 'Array after sorting : '> ;> > for> (> int> i = 0; i cout < < arr[i] < < ' '; return 0; }>

Výkon

Array after sorting : 9 8 7 6 5 4 3 2 1 0 

Časová zložitosť: O(N log N)
Pomocný priestor: O(1)

Zoradiť pole iba v danom rozsahu: Aby sme sa vyrovnali s takýmito typmi problémov, musíme spomenúť rozsah vnútri funkcie triedenia.
Nižšie je uvedená implementácia vyššie uvedeného prípadu:

C++




// C++ program to demonstrate sort()> #include> using> namespace> std;> int> main()> {> > int> arr[] = { 0, 1, 5, 8, 9, 6, 7, 3, 4, 2 };> > int> n => sizeof> (arr) /> sizeof> (arr[0]);> > // Sort the elements which lies in the range of 2 to> > // (n-1)> > sort(arr + 2, arr + n);> > cout < <> 'Array after sorting : '> ;> > for> (> int> i = 0; i cout < < arr[i] < < ' '; return 0; } // This code is contributed by Suruchi Kumari>

Výkon

Array after sorting : 0 1 2 3 4 5 6 7 8 9 

Časová zložitosť: O(N log N)

Pomocný priestor: O(1)

Ako triediť v a konkrétna objednávka?
Môžeme si tiež napísať vlastnú funkciu porovnávača a odovzdať ju ako tretí parameter. Táto porovnávacia funkcia vracia hodnotu; convertible to bool, ktorý nám v podstate hovorí, či odovzdaný prvý argument má byť umiestnený pred odovzdaný druhý argument alebo nie.
Napríklad: V nižšie uvedenom kóde predpokladajme, že intervaly {6,8} a ​​{1,9} sú odovzdané ako argumenty vo funkcii CompareInterval (funkcia komparátora). Teraz ako i1.first (=6)

CPP




// A C++ program to demonstrate> // STL sort() using> // our own comparator> #include> using> namespace> std;> // An interval has a start> // time and end time> struct> Interval {> > int> start, end;> };> // Compares two intervals> // according to starting times.> bool> compareInterval(Interval i1, Interval i2)> {> > return> (i1.start } int main() { Interval arr[] = { { 6, 8 }, { 1, 9 }, { 2, 4 }, { 4, 7 } }; int n = sizeof(arr) / sizeof(arr[0]); // sort the intervals in increasing order of // start time sort(arr, arr + n, compareInterval); cout < < 'Intervals sorted by start time : '; for (int i = 0; i cout < < '[' < < arr[i].start < < ',' < < arr[i].end < < '] '; return 0; }>

Výkon

Intervals sorted by start time : [1,9] [2,4] [4,7] [6,8] 

Časová zložitosť std::sort() je:

  1. Najlepší prípad – O(N log N)
  2. Priemerný prípad – O(N log N)
  3. Najhorší prípad – O(N log N)

Priestorová zložitosť: Môže používať pomocný priestor O( log N).

C++




#include> #include> using> namespace> std;> template> <> class> T>> class> Comparator {> // we pass an object of this class as> > // third arg to sort function...> public> :> > bool> operator()(T x1, T x2)> > {> > return> x1 } }; template bool funComparator(T x1, T x2) { // návratový typ je bool return x1 <= x2; } void show(int a[], int array_size) { for (int i = 0; i cout < < a[i] < < ' '; } } int main() { int a[] = { 1, 5, 8, 9, 6, 7, 3, 4, 2, 0 }; int asize = sizeof(a) / sizeof(int); cout < < 'The array before sorting is : '; show(a, asize); cout < < endl < < 'The array after sorting is(asc) :'; sort(a, a + asize); show(a, asize); cout < < endl < < 'The array after sorting is(desc) :'; sort(a, a + asize, greater ()); zobraziť (a, veľkosť); cout < < endl < < 'The array after sorting is(asc but our ' 'comparator class) :'; sort(a, a + asize, Comparator ()); zobraziť (a, veľkosť); cout < < endl < < 'The array after sorting is(asc but our ' 'comparator function) :'; sort(a, a + asize, funComparator ); zobraziť (a, veľkosť); návrat 0; }>

Výkon

The array before sorting is : 1 5 8 9 6 7 3 4 2 0 The array after sorting is(asc) :0 1 2 3 4 5 6 7 8 9 The array after sorting is(desc) :9 8 7 6 5 4 3 2 1 0 The array after sorting is(asc but our comparator class) :0 1 2 3 4 5 6 7 8 9 The array after sorting is(asc but our comparator function) :0 1 2 3 4 5 6 7 8 9 

Časová zložitosť: O(N log N)
Pomocný priestor: O(1)