- Văn mẫu lớp 9: Đoạn văn suy nghĩ về sự lười biếng (8 mẫu) Những bài văn mẫu lớp 9 hay nhất
- Thực hành tạo form đăng nhập đẹp bằng html và css
- Nỗ Lực Là Gì? Cách Nỗ Lực Để Giúp Cuộc Sống Thành Công Như Mong Muốn!
- Rxjs và Reactive programming – chi tiết về ý nghĩa và cách hoạt động
- Tin học 8 Kết nối tri thức Bài 13. Biểu diễn dữ liệu
Contents
- 1 Giới thiệu
- 2 Xây dựng comparison function
- 3 Ví dụ 1: Sắp xếp mảng giảm dần
- 4 Ví dụ 2: Sắp xếp mảng theo tổng chữ số tăng dần
- 5 Ví dụ 3: Sắp xếp theo trị tuyệt đối giảm dần
- 6 Sắp xếp mảng với nhiều hơn 2 tiêu chí
- 6.1 Ví dụ 1: Sắp xếp mảng theo tổng chữ số tăng dần, nếu hai số có cùng tổng chữ số, thì số lớn hơn sẽ đứng trước.
- 6.2 Ví dụ 2: Sắp xếp sao cho số chẵn đứng trước, lẻ đứng sau, chẵn giảm dần, lẻ tăng dần.
- 6.3 Ví dụ 3: Sắp xếp các điểm trong hệ tọa độ Oxy sao cho hoành độ tăng dần, nếu hoành độ bằng nhau thì sắp xếp theo tung độ giảm dần.
- 7 Kết luận
Giới thiệu
Trong lập trình C++, việc sắp xếp mảng hoặc vector là một công việc phổ biến. Để thực hiện việc sắp xếp này, chúng ta cần sử dụng hàm sort và truyền vào một hàm so sánh (comparison function) để chỉ định thứ tự sắp xếp.
Bạn đang xem: [C++]. Xây Dựng Comparison Function Cho Hàm …
READ MORE:
Xây dựng comparison function
Hàm so sánh là một hàm có kiểu trả về là true hoặc false, và nhận vào hai tham số với kiểu dữ liệu tương ứng với mảng mà bạn muốn sắp xếp. Bạn có thể tự đặt tên cho hàm so sánh, thông thường người ta sử dụng “cmp”.
Cú pháp hàm so sánh:
bool cmp(data_type x, data_type y){
// logic
}
Trong hàm so sánh, bạn cần xác định logic để trả về giá trị true hoặc false:
- Nếu muốn x đứng trước y sau khi sắp xếp, trả về true.
- Nếu muốn x đứng sau y sau khi sắp xếp, trả về false.
Ví dụ:
bool cmp1(int a, int b){
if (a > b) return true;
else return false;
}
Ví dụ 1: Sắp xếp mảng giảm dần
#include
#include
using namespace std;
bool cmp1(int a, int b){
if (a > b) return true;
else return false;
}
int main(){
int a[] = {1, 3, 3, 3, 2, 1, 2, 4, 2, 4, 0, 2};
int n = 12;
sort(a, a + n, cmp1);
cout << "Mảng giảm dần: ";
for(int i = 0; i < n; i++){
cout << a[i] << " ";
}
}
Output:
Mảng giảm dần: 4 4 3 3 3 2 2 2 2 1 1 0
Ví dụ 2: Sắp xếp mảng theo tổng chữ số tăng dần
#include
#include
using namespace std;
int tong(int n){
int ans = 0;
while(n){
ans += n % 10;
n /= 10;
}
return ans;
}
bool cmp1(int a, int b){
if(tong(a) < tong(b)) return true;
else return false;
}
int main(){
int a[] = {1000000, 212, 40, 9, 10001, 30, 449};
int n = 7;
sort(a, a + n, cmp1);
cout << "Mảng sắp xếp theo tổng chữ số tăng dần: ";
for(int i = 0; i < n; i++){
cout << a[i] << " ";
}
}
Output:
Mảng sắp xếp theo tổng chữ số tăng dần: 1000000 10001 30 40 212 9 449
Ví dụ 3: Sắp xếp theo trị tuyệt đối giảm dần
#include
#include
using namespace std;
bool cmp(int a, int b){
if(abs(a) > abs(b)) return true;
else return false;
}
int main(){
int a[] = {3, -5, -1, 4, -2, 6, -7};
int n = 7;
sort(a, a + n, cmp);
cout << "Mảng sắp xếp theo trị tuyệt đối giảm dần: ";
for(int i = 0; i < n; i++){
cout << a[i] << " ";
}
}
Output:
Mảng sắp xếp theo trị tuyệt đối giảm dần: -7 6 -5 4 3 -2 -1
Sắp xếp mảng với nhiều hơn 2 tiêu chí
Thông thường, khi sắp xếp mảng, có những giá trị có cùng thứ tự sẽ yêu cầu thêm một tiêu chí phụ để xác định thứ tự. Ví dụ, sắp xếp danh sách sinh viên theo điểm số giảm dần, nếu hai sinh viên có cùng điểm số, thì sinh viên có tên từ điển nhỏ hơn sẽ đứng trước.
Xem thêm : Contribute là gì? Contribute đi với giới từ gì? Cách sử dụng contribute
Thậm chí, đề bài có thể yêu cầu nhiều hơn 2 tiêu chí. Tuy nhiên, để giải quyết những đề bài như vậy, chúng ta chỉ cần xét từ tiêu chí ưu tiên đầu tiên đến tiêu chí ưu tiên cuối cùng. Nếu có thể sắp xếp theo tiêu chí chính, không cần quan tâm tới tiêu chí phụ.
Ví dụ 1: Sắp xếp mảng theo tổng chữ số tăng dần, nếu hai số có cùng tổng chữ số, thì số lớn hơn sẽ đứng trước.
#include
#include
using namespace std;
int tong(int n){
int ans = 0;
while(n){
ans += n % 10;
n /= 10;
}
return ans;
}
bool cmp(int a, int b){
if(tong(a) != tong(b)){
return tong(a) < tong(b);
}
else{
return a > b;
}
}
int main(){
int a[] = {111, 9, 3000, 20001, 18, 81, 405, 200, 1001};
int n = 9;
sort(a, a + n, cmp);
cout << "Mảng sau khi sắp xếp: ";
for(int i = 0; i < n; i++){
cout << a[i] << " ";
}
}
Output:
Mảng sau khi sắp xếp: 1001 200 20001 3000 111 405 81 18 9
Ví dụ 2: Sắp xếp sao cho số chẵn đứng trước, lẻ đứng sau, chẵn giảm dần, lẻ tăng dần.
#include
#include
using namespace std;
bool cmp(int a, int b){
int r1 = a % 2, r2 = b % 2;
if(r1 == 0 && r2 == 1) return true;
if(r1 == 1 && r2 == 0) return false;
if(r1 == 0 && r2 == 0) return a > b;
if(r1 == 1 && r2 == 1) return a < b;
}
int main(){
int a[] = {1, 2, 10, 9, 6, 5, 8, 7, 4, 3};
int n = 10;
sort(a, a + n, cmp);
cout << "Mảng sau khi sắp xếp: ";
for(int i = 0; i < n; i++){
cout << a[i] << " ";
}
}
Ví dụ 3: Sắp xếp các điểm trong hệ tọa độ Oxy sao cho hoành độ tăng dần, nếu hoành độ bằng nhau thì sắp xếp theo tung độ giảm dần.
#include
#include
using namespace std;
bool cmp(pair x, pair y){
if(x.first != y.first) return x.first < y.first;
else return x.second > y.second;
}
int main(){
pair a[] = {{3, 1}, {3, 2}, {1, 4}, {4, 3}, {3, 3}, {1, 1}, {4, 2}};
int n = 7;
sort(a, a + n, cmp);
cout << "Mảng sau khi sắp xếp: ";
for(pair it : a){
cout << it.first << " " << it.second << endl;
}
}
Output:
Mảng sau khi sắp xếp:
1 4
1 1
3 3
3 2
3 1
4 3
4 2
READ MORE:
Kết luận
Việc xây dựng comparison function cho hàm sort giúp chúng ta sắp xếp mảng một cách linh hoạt và đáp ứng đầy đủ yêu cầu của đề bài. Trên đây là một số ví dụ về cách sử dụng comparison function để sắp xếp mảng theo các tiêu chí khác nhau. Hy vọng rằng những thông tin trên đã giúp bạn hiểu rõ hơn về cách thực hiện việc này trong lập trình C++.
Nguồn: Video tutorial
Nguồn: https://ispacedanang.edu.vn
Danh mục: Học tập