Tui nghĩ cách của bạn hailoc12 là đúng.
Bây giờ mình thử nghĩ thêm 1 chút xíu coi sao nghen: giả sử mảng có nhiều phần tử => mình muốn xài quicksort cho nhanh => mình phải làm ra sao ? Một cách làm là mình đẩy các số chẵn về 1 đầu & các số lẻ về 1 đầu rồi gọi quick sort. Nhưng đề bài là yêu cần chỉ 1 lần sắp xếp !
Thêm nữa, thay vì chẵn & lẻ thì giả sử đề bài là: bội số của 2 ở bên trái, bội số của 3 ở giữa và còn lại thì ở bên phải => mình phải làm ra sao ?
Trong PERL có hàm sort và C có hàm qsort. Cả 2 cái này có chung 1 ý tưởng rất hay: các giải thuật sắp xếp thông thường cuối cùng cũng phải gọi 1 hàm để so sánh 2 phần tử a[i] & a[j] nào đó => mình chỉ cần viết cái hàm này => khi gọi giải thuật sắp xếp thì đưa vô như là 1 tham số. Cái hàm này làm như sau: cho 2 phần tử a và b: trả về -1 nếu a<b, trả về 0 nếu a==b, và trả về 1 nếu a>b (đại khái là như vậy) . Trong ví dụ của mình thì:
1) nếu a chẵn và b lẻ thì a<b; nếu a lẻ và b chẵn thì a>b; ...........
2) nếu a là bội số của 2 và b không là bội số của 2 thì a<b, nếu a là bội số của 3 ......
Trường hợp thứ 2 rắc rối 1 chút (if, else .....); nhưng mình không cần phải viết lại hàm sắp xếp (mà lúc nào cũng chỉ cần viết lại hàm so sánh mà thôi). Mình có thể viết hàm so sánh ở trường hợp thứ hai khác đi 1 chút: xài 2 cấp so sánh. Nếu bội số của 2 thì cho điểm (ở mức 1) là 1, nếu là bội số của 3 thì cho điểm (ở mức 1) là 2, còn lại thì cho điểm là 3; nếu a & b có cùng điểm (ở múc 1) thì ........... . Viết như vậy thì sẽ đỡ sót trường hợp và "if else" rối rắm
(có gì sai sót mong được góp ý, xin cám ơn)
-thân