Sắp xếp là một công việc rất quan trọng trong việc quản lý dữ liệu vì nó giúp chúng ta tìm kiếm thông tin một cách nhanh chóng. Tuy nhiên với lập trình Web thì chúng ta lại ít đụng đến các thuật toán sắp xếp, và PHP cũng đã có cung cấp một số hàm sắp xếp sẵn rất tiện lợ. Nhưng chúng ta đang học lập trình nên bạn cũng không nên bỏ qua các kiến thức về thuật toán này.
Trong bài này chúng ta sẽ nghiên cứu một thuật toán sắp xếp đơn giản nhất đó là thuật toán sắp xếp nổi bọt(bubble sort). Ý tưởng của thuật toán bắt nguồn từ việc so sánh 2 phần tử cạnh nhau và hoán vị chúng nếu không đúng vị trí. Ta có thể tiến hành từ trái qua phải hoặc từ phải qua trái tùy vào nhu cầu của mình.
Note: Để tiện việc giảng giải tôi gọi
$nlà tổng số phần tử của mảng, 1 là vị trí phần tử đầu tiên của mảng (trong mảng bắt đầu từ 0 nhưng tôi gắn nó bằng 1 để dễ sử dụng hơn)
1. Sắp xếp nổi bọt tăng dần
Thuật toán sắp xếp nổi bọt tăng dần được xử lý như sau:
Cho vòng lặp $i chạy từ  1 tới ($n-1):
Lần lặp 1: $i = 1, lần lược so sánh với các vị trí khác bắt đầu từ ($i + 1) tức là vị trí 2, nếu phần tử thứ 1 lớn hơn các phần tử đứng sau bắt đầu từ 2 thì hoán vị chúng.
Lần lặp 2: $i = 2, lần lược so sánh với các vị trí khác bắt đầu từ ($i + 1) tức là vị trí 3, nếu phần tử thứ 2 lớn hơn các phần tử đứng sau nó bắt đầu từ 3 thì hoán vụ chúng.
Cứ như vậy cho đến khi ta lặp lần thứ ($n – 1), lúc này biến $i = ($n-1), ta so sánh với phần tử cuối cùng ($n) và hoán vị nếu không thỏa mãn.
Ví dụ: Cho mảng sau: $mang = array(1, 5, 9, 2, 4, 9), hãy dùng thuật toán sắp xếp nổi bọt để sắp xếp mảng theo thứ tự tăng dần.
Mảng này có 6 phần tử bắt đầu từ 0 -> 5. Vì thế ta có bài giải như sau:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | $mang= array(1, 5, 9, 2, 4, 9); // mảng theo đề bài $sophantu= 6; // hoặc dùng hàm $sophantu = count($mang); // Sắp xếp mảngfor($i= 0; $i< ($sophantu- 1); $i++){    for($j= $i+ 1; $j< $sophantu; $j++) // lặp các phần tử phía sau    {        if($mang[$i] > $mang[$j]) // nếu phần tử $i bé hơn phần tử phía sau        {            // hoán vị            $tmp= $mang[$j];            $mang[$j] = $mang[$i];            $mang[$i] = $tmp;        }    }} // Hiển thị các phần tử của mảng đã sắp xếpfor($i= 0; $i< $sophantu; $i++){    echo$mang[$i] . ' ';} | 
Trong bài này ta sử dụng vòng lặp for lồng nhau để duyệt các phần tử. Với mỗi vòng lặp $i, ta sẽ dùng vòng lặp $j để duyệt từ vị trí tiếp ($i + 1) theo đến cuối mảng, nếu không đúng vị trí thì thực hiện đổi vị trí cho nhau.
Có lẽ các bạn không hiểu ở chỗ hoán vị. tại sao lại có một biến $tmp? Các bạn thử suy nghĩ giả sử bạn đang ôm một cái bao khá năng nên bạn phải ôm 2 tay, và Bố của bạn đang ôm một cái ghế cũng khá nặng và đương nhiên cũng phải ôm 2 tay. Giờ bạn muốn đổi 2 món đồ vật này tức là bạn sẽ đưa cái bao cho Bố bạn và Bố bạn đưa cái ghế cho bạn.  Giờ làm sao để đổi đây? giải pháp là nhờ một người trung gian giữ hộ cái bao cho bạn, rồi bố bạn đưa cái ghế cho bạn, sau đó bố bạn lấy cái bao từ người trung gian ấy. Từ đó suy ra trong đoạn code hoán vị mình đã dùng biến $tmp để làm biến trung gian lưu trữ.
2. Sắp xếp nổi bọt giảm dần
Thuật toán sắp xếp nổi bọt giảm dần thì ý tưởng cũng tương tự như so sánh tăng dần, chỉ có khác khi so sánh 2 phần tử với nhau thì nếu phần tử thứ $i bé hơn phần tử ($i + 1)thì hoán vị 2 vị trí đó. Với ví dụ trên ta có bài giải như sau:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | $mang= array(1, 5, 9, 2, 4, 9); // mảng theo đề bài $sophantu= 6; // hoặc dùng hàm $sophantu = count($mang); // Sắp xếp mảngfor($i= 0; $i< ($sophantu- 1); $i++){    for($j= $i+ 1; $j< $sophantu; $j++) // lặp các phần tử phía sau    {        if($mang[$i] < $mang[$j]) // nếu phần tử $i bé hơn phần tử phía sau        {            // hoán vị            $tmp= $mang[$j];            $mang[$j] = $mang[$i];            $mang[$i] = $tmp;        }    }} // Hiển thị các phần tử của mảng đã sắp xếpfor($i= 0; $i< $sophantu; $i++){    echo$mang[$i] . ' ';} | 
3. Đưa thuật toán sắp xếp nổi bọt vào hàm
Tôi có thắc mắc là tại sao chúng ta lại code một cách không chuyên nghiệp gì hết vậy trong khi chúng ta đã học bài xây dựng hàm trong php? Để chương trình có tính mở rộng và dễ quản lý, bào trì thì chúng ta nên đưa đoạn code sắp xếp vào một hàm.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | // Ham sắp xếpfunctionsap_xep_tang($mang){    $sophantu= count($mang);    // Sắp xếp mảng    for($i= 0; $i< ($sophantu- 1); $i++)    {        for($j= $i+ 1; $j< $sophantu; $j++)        {            if($mang[$i] > $mang[$j])            {                // hoán vị                $tmp= $mang[$j];                $mang[$j] = $mang[$i];                $mang[$i] = $tmp;            }        }    }    return$mang;} // Hàm xuất ra màn hìnhfunctionxuat_mang_ra_man_hinh($mang){    $sophantu= count($mang);    for($i= 0; $i< $sophantu; $i++){        echo$mang[$i] . ' ';    }} //--------------------------------------------------// Chương trình chính$mang= array(1, 5, 9, 2, 4, 9); // mảng theo đề bài // sắp xếp$mang= sap_xep_tang($mang); // xuất ra màn hìnhxuat_mang_ra_man_hinh($mang); | 
4. Lời kết
Thuật toán sắp xếp nổi bọt trong php đơn giản và dễ cài đặt, vì thế nó được sử dụng rât rộng rãi trong các chương trình học lập trình ở các trường đại học ở bộ môn cấu trúc dữ liệu căn bản.
Theo:freetuts.net
 
                                       


 
							 
							 
							 
							 
							 
							 
							 
							 
							 
							 
							 
							 
							 
															
							 
                             
             
            
 Vietnamese
 Vietnamese Afrikaans
 Afrikaans Albanian
 Albanian Amharic
 Amharic Arabic
 Arabic Armenian
 Armenian Azerbaijani
 Azerbaijani Basque
 Basque Belarusian
 Belarusian Bengali
 Bengali Bosnian
 Bosnian Bulgarian
 Bulgarian Catalan
 Catalan Cebuano
 Cebuano Chichewa
 Chichewa Chinese (Simplified)
 Chinese (Simplified) Chinese (Traditional)
 Chinese (Traditional) Corsican
 Corsican Croatian
 Croatian Czech
 Czech Danish
 Danish Dutch
 Dutch English
 English Esperanto
 Esperanto Estonian
 Estonian Filipino
 Filipino Finnish
 Finnish French
 French Frisian
 Frisian Galician
 Galician Haitian Creole
 Haitian Creole Georgian
 Georgian German
 German Greek
 Greek Gujarati
 Gujarati Hausa
 Hausa Hawaiian
 Hawaiian Hebrew
 Hebrew Hindi
 Hindi Hmong
 Hmong Hungarian
 Hungarian Icelandic
 Icelandic Igbo
 Igbo Indonesian
 Indonesian Irish
 Irish Italian
 Italian Japanese
 Japanese Javanese
 Javanese Kannada
 Kannada Kazakh
 Kazakh Khmer
 Khmer Korean
 Korean Kurdish (Kurmanji)
 Kurdish (Kurmanji) Kyrgyz
 Kyrgyz Lao
 Lao Latin
 Latin Latvian
 Latvian Lithuanian
 Lithuanian Luxembourgish
 Luxembourgish Macedonian
 Macedonian Malagasy
 Malagasy Malay
 Malay Malayalam
 Malayalam Maltese
 Maltese Maori
 Maori Marathi
 Marathi Mongolian
 Mongolian Myanmar (Burmese)
 Myanmar (Burmese) Nepali
 Nepali Norwegian
 Norwegian Pashto
 Pashto Persian
 Persian Polish
 Polish Portuguese
 Portuguese Punjabi
 Punjabi Romanian
 Romanian Russian
 Russian Samoan
 Samoan Scottish Gaelic
 Scottish Gaelic Sinhala
 Sinhala Serbian
 Serbian Sesotho
 Sesotho Shona
 Shona Sindhi
 Sindhi Slovenian
 Slovenian Slovak
 Slovak Somali
 Somali Spanish
 Spanish Sundanese
 Sundanese Swahili
 Swahili Swedish
 Swedish Tajik
 Tajik Tamil
 Tamil Telugu
 Telugu Thai
 Thai Turkish
 Turkish Ukrainian
 Ukrainian Urdu
 Urdu Uzbek
 Uzbek Welsh
 Welsh Xhosa
 Xhosa Yiddish
 Yiddish Yoruba
 Yoruba Zulu
 Zulu