Thực hành: sắp xếp mảng trong PHP không cần dùng hàm

Trong PHP bạn có đầy đủ các hàm sắp xếp mảng, điều đó có nghĩa là bình thường khi cần thiết bạn sẽ áp dụng các hàm đó thôi, để tiết kiệm thời gian và công sức – không phải gõ code thuần để làm lại việc này nữa. Bạn lại hỏi mình, thế bài viết này có ý nghĩa gì? Câu trả lời là: luyện tư duy.
Điều quan trọng nhất trong lập trình đó là tư duy và chăm chỉ, cả hai cái đều bổ sung cho nhau rất tốt.

Nếu có tư duy đúng bạn có thể chuyển đổi bài toán sang bất kỳ ngôn ngữ nào.

Giờ chúng ta đi vào vấn đề chính. Giả dụ tôi có hàm như sau:

$bang_diem = array(7, 5.5, 9, 6, 7.2, 7.8, 10, 5);

Bạn thấy rằng hàm này không được sắp xếp có thự tự, giờ chúng ta phải xếp lại theo thứ tự tăng dần mà không được dùng hàm đã có sẵn là sort()

Ý tưởng: theo thứ tự tăng dần có nghĩa là cái bé nhất xếp đầu tiên, tiếp theo là cái lớn hơn cái bé nhất nhưng lại nhỏ hơn những cái còn lại, cứ thế cho đến phần tử cuối cùng.

Chúng ta tưởng tượng giống như việc xếp hàng ngày xưa, người nhỏ nhất ở đầu, nhỡ mà trong khi xếp hàng, chúng ta thấy ai nhỏ hơn mà lại ở phía sau ta bảo họ đổi chỗ lên trên.

Hoặc chúng ta làm thế này, ta tìm người thấp nhất bảo họ đứng ra một chỗ, tiếp theo với những người còn lại chúng ta lại tiếp tục tìm người thấp nhất trong số đó rồi bảo họ xếp tiếp người đầu tiên vừa được cho ra riêng một chỗ. Cứ làm như thế chúng ta có được một hàng có thứ tự cao dần về phía sau.

Như vậy có thể nói hàm sắp xếp theo thứ tự có thể quy về cách thức tìm giá trị cực đại hoặc cực tiểu.

Theo yêu cầu của đề bài là theo thứ tự tăng dần nên chúng ta sẽ phải tìm giá trị cực tiểu n – 1 lần (với n là số phần tử của mảng)

Đây là đoạn code giúp tìm giá trị nhỏ nhất của mảng:

$bang_diem = array(7, 5.5, 9, 6, 7.2, 7.8, 10, 5);

$clength = count($bang_diem);

for($x = 0; $x < $clength; $x++) {
 
        $min=$bang_diem[$x];
 
            for($y = 0; $y < ($clength); $y++) {
 
                if ($min > $bang_diem[$y]) {
 
                    $min = $bang_diem[$y];
 
}}}
Giải thích:
  • Đầu tiên để đếm số phần tử của mảng ta dùng hàm count.
  • Dùng 2 vòng lặp for lồng nhau để tiến hành so sánh.
  • Gán $min có giá trị là phần tử đầu tiên, sau đó đem phần tử đó so sánh với các phần tử còn lại của mảng, bất cứ khi nào $min lớn hơn một phần từ nào đó nghĩa là $min vẫn chưa phải nhỏ nhất thì khi ấy $min được gán giá trị nhỏ hơn này. if ($min > $bang_diem[$y]) {$min = $bang_diem[$y];}
  • Quá trình so sánh này được lặp lại đúng bằng số phần từ của mảng, cho nên cuối cùng sau n lần nó sẽ tìm được đúng phần tử cần tìm – là phần tử nhỏ nhất của mảng.
Vậy công việc tiếp theo là gì? Đó là chúng ta sẽ lôi phần tử nhỏ nhất này ra một chỗ khác. Cụ thể là nhồi nó vào mảng mới.
Tiện đây, tìm giá trị lớn nhất của mảng, ta chỉ việc đổi dấu là xong.
Tìm max:
$bang_diem = array(7, 5.5, 9, 6, 7.2, 7.8, 10, 5);
 
$clength = count($bang_diem);
 
for($x = 0; $x < $clength; $x++) {
 
        $max=$bang_diem[$x];
 
            for($y = 0; $y < ($clength); $y++) {
 
                if ($max < $bang_diem[$y]) {
 
                    $max = $bang_diem[$y];
 
}}}
 
Giờ ta đã tìm được giá trị nhỏ nhất của mảng, làm thế nào ta tìm được giá trị nhỏ thứ nhì? Cách dễ nhất là loại bỏ phần tử nhỏ nhất đầu tiên đi và lặp lại đoạn mã tìm giá trị nhỏ nhất, vì giá trị nhỏ nhất đầu tiên đã bị loại, giá trị nhỏ nhất mới chính là cái thứ nhì.
Nhưng trong khi chúng ta không biết hàm loại bỏ phần tử khỏi mảng thì phải dùng cách nào để biến giá trị nhỏ nhất không được xét tới nữa.
Đơn giản là gán giá trị nhỏ nhất đó thành giá trị lớn nhất.
Đây là toàn bộ đoạn code giúp bạn sắp xếp thứ tự tăng dần:
<?php
$bang_diem = array(7, 5.5, 9, 6, 7.2, 7.8, 10, 5);
$sap_xep = array();
 
$clength = count($bang_diem);
 
for($x = 0; $x < $clength; $x++) {
        $max=$bang_diem[$x];
            for($y = 0; $y < ($clength); $y++) {
                if ($max < $bang_diem[$y]) {
                    $max = $bang_diem[$y];}}}
 
 
for ($m = 0; $m < $clength; $m++) {
    for($x = 0; $x < $clength; $x++) {
        $min=$bang_diem[$x];
            for($y = 0; $y < ($clength); $y++) {
                if ($min > $bang_diem[$y]) {
                    $min = $bang_diem[$y];
}}}
$sap_xep[$m] = $min;
for($t = 0; $t < $clength; $t++) {if ($bang_diem[$t]==$min) {$bang_diem[$t]=$max;}}}
 
 
for($x = 0; $x < $clength; $x++) {
echo $sap_xep[$x];
echo “, “;}
?>

Bạn có thể thấy quá trình tìm min được lặp lại đúng bằng số phần tử của mảng. Phần tử nhỏ nhất được quẳng vào mảng mới $sap_xep theo thư tự tăng dần, vì vậy cuối cùng ta có được điều như ý.

Leave a Comment