Xem thêm

Sử dụng sort() trong thư viện std của C++

Huy Erick
Sắp xếp dữ liệu với sort() trong C++ Hôm nay chúng ta sẽ đến với chủ đề thú vị về hàm sort() trong thư viện std của C++. Khi nói về cơ bản, sắp xếp...

Sắp xếp dữ liệu với sort() trong C++

Hôm nay chúng ta sẽ đến với chủ đề thú vị về hàm sort() trong thư viện std của C++.

Khi nói về cơ bản, sắp xếp là quá trình đặt các phần tử theo thứ tự một cách có hệ thống. Các phần tử này có thể là các thành phần của một chuỗi hoặc bất kỳ cấu trúc dữ liệu nào khác.

Trong C++, thư viện chuẩn cung cấp một hàm sẵn có để thực hiện phép sắp xếp này là hàm sort(). Hãy cùng tìm hiểu chi tiết về nó.

Hàm sort() trong thư viện std của C++

Hàm sort() trong C++ là một hàm tích hợp sẵn được sử dụng để sắp xếp bất kỳ cấu trúc dữ liệu nào theo một thứ tự nhất định. Hàm này được định nghĩa trong tệp đầu mục thuật toán. Prototype của hàm sort() được cung cấp dưới đây.

void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

Ở đây, hàm không trả về bất cứ gì. Nó chỉ cập nhật các phần tử/tiện ích từ vị trí đầu tiên đến vị trí cuối cùng. Tham số thứ ba (tùy chọn) comp phải là một hàm xác định thứ tự mà các phần tử sẽ được sắp xếp. Khi không được chỉ định, việc sắp xếp sẽ diễn ra theo thứ tự tăng dần, mặc định là hàm std::less().

Hàm sort() sử dụng một kỹ thuật sắp xếp Introsort bằng 3 lần lượt gọi Quick Sort, Heap Sort, và Insertion Sort.

Sắp xếp dữ liệu sử dụng hàm sort() trong C++

Sau khi đã hiểu cơ bản về hàm sort(), chúng ta hãy sử dụng nó trong chương trình C++ của chúng ta để sắp xếp một số cấu trúc dữ liệu (ví dụ: mảng).

1. Sắp xếp theo thứ tự tăng dần

Như đã đề cập trước đó, mặc định hàm sort() sắp xếp một tập hợp các phần tử theo thứ tự tăng dần khi không có tham số comp.

Ví dụ dưới đây, chúng ta chỉ truyền các phần tử đầu tiên (bắt đầu) và cuối cùng (kết thúc) để sắp xếp một mảng theo thứ tự tăng dần.

#include  #include  using namespace std;  int main() {     // Khởi tạo mảng     int demo[5] = {5, 4, 3, 2, 1};     int len = sizeof(demo)/sizeof(demo[0]);      cout << "Trước khi sắp xếp mảng: ";     for(int i=0; i

Output:

Sort1

Ở đây, demo là địa chỉ phần tử đầu tiên và (demo + len) là địa chỉ phần tử cuối cùng của mảng đã cho. Vì vậy, với giả định comp là hàm std::less() theo mặc định, hàm sort() sẽ sắp xếp mảng theo thứ tự tăng dần.

Lưu ý: Hàm std::less() so sánh hai đối số và trả về True hoặc False dựa trên việc xem xét xem đối số đầu tiên có nhỏ hơn đối số thứ hai hay không.

2. Sắp xếp theo thứ tự giảm dần

Chúng ta cũng có thể sắp xếp một cấu trúc dữ liệu theo thứ tự giảm dần bằng cách điều chỉnh tham số thứ ba của hàm sort(). Hãy xem cách thực hiện.

Trong đoạn mã dưới đây, chúng ta đã sử dụng hàm std::greater() như trong hàm std::less() để đảo ngược thứ tự. Hàm std::greater() so sánh hai đối số và trả về True khi đối số đầu tiên lớn hơn đối số thứ hai. Ngược lại, trả về False.

#include  #include  using namespace std;  int main() {     // Khởi tạo mảng     int demo[5] = {44, 22, 55, 33, 66};     int len = sizeof(demo)/sizeof(demo[0]);      cout << "Trước khi sắp xếp mảng: ";     for(int i=0; i()); // Sắp xếp mảng demo      cout << "\nSau khi sắp xếp mảng: ";     for(int i=0; i

Chúng ta cũng có thể sử dụng hàm lambda làm tham số thứ ba cho hàm sort() như được hiển thị ở ví dụ dưới đây.

#include  #include  using namespace std;  int main() {     // Khởi tạo mảng     int demo[5] = {44, 22, 55, 33, 66};     int len = sizeof(demo)/sizeof(demo[0]);      cout << "Trước khi sắp xếp mảng: ";     for(int i=0; i e2;     }); // Sắp xếp mảng demo      cout << "\nSau khi sắp xếp mảng: ";     for(int i=0; i

Cả hai ví dụ trên đều tạo ra cùng một kết quả như dưới đây và sắp xếp mảng demo theo thứ tự giảm dần thành công.

Output:

Sort2

3. Sắp xếp theo thứ tự do người dùng định nghĩa

Tham số thứ ba (comp) cho hàm std::sort() cũng có thể là một hàm được định nghĩa bởi người dùng xác định thứ tự hoặc sắp xếp.

Người dùng cần lưu ý rằng hàm này phải trả về một giá trị boolean (True/False).

Ví dụ trong đoạn mã dưới đây, chúng ta đã cố gắng sắp xếp các phần tử của một mảng dựa trên những số dư khi chia cho 10 (sử dụng toán tử '%').

#include  #include  using namespace std;  // Hàm do chúng ta định nghĩa bool My_func(int a, int b) {     return (a % 10) < (b % 10); }  int main() {     // Khởi tạo mảng     int demo[5] = {18, 45, 34, 92, 21};     int len = sizeof(demo)/sizeof(demo[0]);      cout << "Trước khi sắp xếp mảng: ";     for(int i=0; i

Output:

Sort3

Như chúng ta có thể thấy từ kết quả trên, mảng demo đã được sắp xếp thành công dựa trên yếu tố (element % 10) với sự giúp đỡ của hàm My_func của chúng ta.

Độ phức tạp của hàm sort() trong C++

Hàm sort() thực hiện Nlog(N) so sánh để sắp xếp N phần tử. Do đó, đối với trường hợp tồi nhất, nó có độ phức tạp là O(Nlog(N)).

Kết luận

Vậy là đến đây là hết rồi. Hôm nay, chúng ta đã hiểu cách sử dụng và hoạt động của hàm sort() trong thư viện chuẩn C++ để sắp xếp. Hi vọng bạn đã hiểu rõ.

Vui lòng lưu ý rằng hàm sort() có thể được sử dụng cho cấu trúc dữ liệu khác ngoài mảng, như vectors, v.v... Trong bài hướng dẫn này, chúng tôi đã xem xét mảng cho việc hiểu rõ hơn.

Chúng tôi khuyến nghị bạn nên đọc qua Hướng dẫn C++ của chúng tôi.

Nếu còn câu hỏi nào khác, hãy sử dụng phần bình luận bên dưới.

Tham khảo

  • std::sort() - Tài liệu C++,
  • Thư viện mẫu chuẩn (STL) trong C++,
  • - Thư viện thuật toán C++.
1