C++ Algorithm sort
The sort function in C++ Algorithm organizes the elements within the range [first, last) in ascending order.
The elements are compared using the < operator in the initial version, and comp in the subsequent version.
Syntax
default (1)
template <class RandomAccessIterator>
void sort (RandomAccessIterator first, RandomAccessIterator last);
custom (2)
template <class RandomAccessIterator, class Compare>
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
Parameter
An arbitrary access iterator pointing to the initial element within the range intended for sorting.
last : A random access iterator pointing to the element past the last one in the range that needs to undergo sorting.
The ```
include <iostream>
include <vector>
include <algorithm>
include <functional>
using namespace std;
void print(const vector <std::string>& v)
{
vector <string>::const_iterator i;
for(i = v.begin; i != v.end; i++)
{
cout << *i << " ";
}
cout << endl;
}
int main
{
vector <string> v;
// Push functional programming languages
v.push_back("Lisp");
v.push_back("C#");
v.push_back("Java");
v.push_back("Python");
v.push_back("C++");
v.push_back("Pascal");
v.push_back("Sql");
// sort without predicate
sort(v.begin, v.end);
cout << "Sorted list of functional programming languages - " << endl;
print(v);
// sort with predicate
sort(v.begin, v.end, std::greater<std::string>);
cout << "Reverse Sorted list of functional programming languages - " << endl;
print(v);
}
## Return value
## Complexity
The average time complexity of a sorting algorithm is N*log₂(N), where N equals the value of last minus first.
## Data races
The elements within the range [first, last) undergo modification.
## Exceptions
This function will raise an exception if an exception is thrown during any element comparisons, element swaps, or iterator operations.
### Note: The invalid parameters cause an undefined behavior.
## Example 1
Let's explore a basic example to showcase the functionality of the sort() method:
include <iostream>
include <vector>
include <algorithm>
using namespace std;
int main
{
vector<int> v = {3, 1, 4, 2, 5};
cout<<"Before sorting: ";
for_each(v.begin, v.end, (int x) {
cout << x << " ";
});
sort(v.begin, v.end);
cout<<"\nAfter sorting: ";
for_each(v.begin, v.end, (int x) {
cout << x << " ";
});
return 0;
}
Output:
Before sorting: 3 1 4 2 5
After sorting: 1 2 3 4 5
## Example 2
Let's see another simple example:
include <iostream> // std::cout
include <algorithm> // std::sort
include <vector> // std::vector
using namespace std;
bool myfunction (int i,int j) { return (i<j); }
struct myclass {
bool operator (int i,int j) { return (i<j);}
} myobject;
int main {
int myints = {32,71,12,45,26,80,53,33};
vector<int> myvector (myints, myints+8); // 32 71 12 45 26 80 53 33
// using default comparison (operator <):
sort (myvector.begin, myvector.begin+4); //(12 32 45 71)26 80 53 33
// using function as comp
sort (myvector.begin+4, myvector.end, myfunction); // 12 32 45 71(26 33 53 80)
// using object as comp
sort (myvector.begin, myvector.end, myobject); //(12 26 32 33 45 53 71 80)
// print out content:
cout << "myvector contains:";
for (vector<int>::iterator it=myvector.begin; it!=myvector.end; ++it)
cout << ' ' << *it;
cout << '\n';
return 0;
}
Output:
myvector contains: 12 26 32 33 45 53 71 80
## Example 3
Let's see another simple example:
include <iostream>
include <vector>
include <algorithm>
include <functional>
using namespace std;
void print(const vector <std::string>& v)
{
vector <string>::const_iterator i;
for(i = v.begin; i != v.end; i++)
{
cout << *i << " ";
}
cout << endl;
}
int main
{
vector <string> v;
// Push functional programming languages
v.push_back("Lisp");
v.push_back("C#");
v.push_back("Java");
v.push_back("Python");
v.push_back("C++");
v.push_back("Pascal");
v.push_back("Sql");
// sort without predicate
sort(v.begin, v.end);
cout << "Sorted list of functional programming languages - " << endl;
print(v);
// sort with predicate
sort(v.begin, v.end, std::greater<std::string>);
cout << "Reverse Sorted list of functional programming languages - " << endl;
print(v);
}
Output:
Sorted list of functional programming languages -
C# C++ Java Lisp Pascal Python Sql
Reverse Sorted list of functional programming languages -
Sql Python Pascal Lisp Java C++ C#
## Example 4
Let's see another simple example:
include <vector>
include <algorithm>
include <functional>
include <iostream>
using namespace std;
// return whether first element is greater than the second
bool userdefgreater(int elem1, int elem2)
{ return elem1 > elem2; }
int main
{
vector <int> vec1; // container
vector <int>::iterator Iter1; // iterator
int k;
for (k = 0; k <= 15; k++)
vec1.push_back(k);
random_shuffle(vec1.begin, vec1.end);
cout <<"Original random shuffle vector vec1 data:\n";
for (Iter1 = vec1.begin; Iter1 != vec1.end; Iter1++)
cout <<*Iter1<<" ";
cout <<endl;
sort(vec1.begin, vec1.end);
cout <<"\nSorted vector vec1 data:\n";
for (Iter1 = vec1.begin; Iter1 != vec1.end; Iter1++)
cout <<*Iter1<<" ";
cout <<endl;
// to sort in descending order, specify binary predicate
sort(vec1.begin, vec1.end, greater<int>);
cout <<"\nRe sorted (greater) vector vec1 data:\n";
for (Iter1 = vec1.begin; Iter1 != vec1.end; Iter1++)
cout <<*Iter1<<" ";
cout <<endl;
// a user-defined binary predicate can also be used
sort(vec1.begin, vec1.end, userdefgreater);
cout <<"\nUser defined re sorted vector vec1 data:\n";
for (Iter1 = vec1.begin; Iter1 != vec1.end; Iter1++)
cout <<*Iter1<<" ";
cout <<endl;
return 0;
}
Output:
Original random shuffle vector vec1 data:
4 10 11 15 14 5 13 1 6 9 3 7 8 2 0 12
Sorted vector vec1 data:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Re sorted (greater) vector vec1 data:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
User defined re sorted vector vec1 data:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0