Đôi lúc trong cùng 1 bài tập, bạn vừa cần sắp xếp 1 mãng tăng, 1 mãng giảm. Không cần phải viết 2 hàm, cũng không cần phải chia ra 2 trường hợp để giải. Bạn có thể viết 1 hàm như sau:
Ví dụ:
+ Khi cần sắp xếp mãng A có n phần tử theo chiều tăng dần: BubbleSort(A, n, 1);
+ Khi cần sắp xếp mãng B có m phần tử theo chiều giảm dần: BubbleSort(B, m, 0);
Giải thích:
Mấu chốt vấn đề là ở câu điều kiện: (A[j] > A[j+1]) == index
+ Nếu ta đang cần sắp xếp tăng, tức là index = 1 (hay True).
Khi điều kiện A[j] > A[j+1] đúng (tức là số trước lớn hơn số sau) thì ta sẽ đổi chỗ; Đúng tức là = True, vậy khi đó (A[j] > A[j+1]) == index
+ Nếu ta đang cần sắp xếp giảm, tức là index = 0 (hay False).
Khi điều kiện A[j] > A[j+1] sai (tức là số trước KHÔNG lớn hơn số sau) thì ta sẽ đổi chỗ; Sai tức là = False, vậy khi đó (A[j] > A[j+1]) == index
Vậy điều kiện (A[j] > A[j+1]) == index là đúng cho cả 2 trường hợp sắp xếp tăng và giảm.
Code:
void BubbleSort(int A[], int n, int index) // index = 1 : sap xep tang; index = 0 : sap xep giam;
{
for (int i=n-1; i>0; i--)
for (int j=0; j<i; j++)
if ((A[j] > A[j+1]) == index)
{
int temp = A[j];
A[j] = A[j+1];
A[j+1] = temp;
}
}
Ví dụ:
+ Khi cần sắp xếp mãng A có n phần tử theo chiều tăng dần: BubbleSort(A, n, 1);
+ Khi cần sắp xếp mãng B có m phần tử theo chiều giảm dần: BubbleSort(B, m, 0);
Giải thích:
Mấu chốt vấn đề là ở câu điều kiện: (A[j] > A[j+1]) == index
+ Nếu ta đang cần sắp xếp tăng, tức là index = 1 (hay True).
Khi điều kiện A[j] > A[j+1] đúng (tức là số trước lớn hơn số sau) thì ta sẽ đổi chỗ; Đúng tức là = True, vậy khi đó (A[j] > A[j+1]) == index
+ Nếu ta đang cần sắp xếp giảm, tức là index = 0 (hay False).
Khi điều kiện A[j] > A[j+1] sai (tức là số trước KHÔNG lớn hơn số sau) thì ta sẽ đổi chỗ; Sai tức là = False, vậy khi đó (A[j] > A[j+1]) == index
Vậy điều kiện (A[j] > A[j+1]) == index là đúng cho cả 2 trường hợp sắp xếp tăng và giảm.
(Dương Tấn Thành)