Thuật toán sắp xếp nổi bọt

Sắp xếp nổi bọt là một thuật toán sắp xếp đơn giản. Thuật toán sắp xếp này là thuật toán dựa trên so sánh, trong đó mỗi cặp yếu tố liền kề được so sánh và các yếu tố được hoán đổi nếu chúng không theo thứ tự. Thuật toán này không phù hợp với các tập dữ liệu lớn vì độ phức tạp trung bình và trường hợp xấu nhất của nó là (n 2 ) trong đó n là số phần tử.

Cách sắp xếp nổi bọt hoạt động?

Giả sử chúng ta có một mảng không có thứ tự gồm các phần tử như dưới đây. Bây giờ chúng ta sử dụng giải thuật sắp xếp nổi bọt để sắp xếp mảng này.

Giải thuật sắp xếp nổi bọt bắt đầu với hai phần tử đầu tiên, so sánh chúng để kiểm tra xem phần tử nào lớn hơn.

Trong trường hợp này, 33 lớn hơn 14, do đó hai phần tử này đã theo thứ tự. Tiếp đó chúng ta so sánh 33 và 27.

Chúng ta thấy rằng 33 lớn hơn 27, do đó hai giá trị này cần được tráo đổi thứ tự.

Mảng mới thu được sẽ như sau:

\

Tiếp đó chúng ta so sánh 33 và 35. Hai giá trị này đã theo thứ tự.

Sau đó chúng ta so sánh hai giá trị kế tiếp là 35 và 10.

Vì 10 nhỏ hơn 35 nên hai giá trị này chưa theo thứ tự.

Tráo đổi thứ tự hai giá trị. Chúng ta đã tiến tới cuối mảng. Vậy là sau một vòng lặp, mảng sẽ trông như sau:

Để đơn giản, tiếp theo mình sẽ hiển thị hình ảnh của mảng sau từng vòng lặp. Sau lần lặp thứ hai, mảng sẽ trông giống như:

Sau mỗi vòng lặp, ít nhất một giá trị sẽ di chuyển tới vị trí cuối. Sau vòng lặp thứ 3, mảng sẽ trông giống như:

Và khi không cần tráo đổi thứ tự phần tử nào nữa, giải thuật sắp xếp nổi bọt thấy rằng mảng đã được sắp xếp xong.

Tiếp theo, chúng ta tìm hiểu thêm một số khía cạnh thực tế của giải thuật sắp xếp.

Thuật toán

Chúng tôi giả sử danh sách là một mảng gồm n phần tử. Chúng tôi cũng cho rằng trao đổi chức năng hoán đổi giá trị của các phần tử mảng nhất định.

begin BubbleSort(list)

   for all elements of list

      if list[i] > list[i+1]

         swap(list[i], list[i+1])

      end if

   end for

   return list

end BubbleSort

Giải thuật mẫu cho sắp xếp nổi bọt (Bubble Sort)

Chúng ta thấy rằng giải thuật sắp xếp nổi bọt so sánh mỗi cặp phần tử trong mảng trừ khi cả toàn bộ mảng đó đã hoàn toàn được sắp xếp theo thứ tự tăng dần. Điều này có thể làm tăng độ phức tạp, tức là tăng các thao tác so sánh và tráo đổi không cần thiết nếu như mảng này không cần sự tráo đổi nào nữa khi tất cả các phần tử đã được sắp xếp theo thứ tự tăng dần rồi.

Để tránh việc này xảy ra, chúng ta có thể sử dụng một biến swapped chẳng hạn để giúp chúng ta biết có cần thực hiện thao tác tráo đổi thứ tự hay không. Nếu không cần thiết thì thoát khỏi vòng lặp.

Bạn theo dõi phần giải thuật mẫu minh họa sau:

procedure bubbleSort( list : array of items )

   loop = list.count;

   for i = 0 to loop-1 do:

      swapped = false       

      for j = 0 to loop-1 do:

         /* compare the adjacent elements */  

         if list[j] > list[j+1] then

            /* swap them */

            swap( list[j], list[j+1] )         

            swapped = true

         end if

      end for

      /*if no number was swapped that means

      array is sorted now, break the loop.*/ 

      if(not swapped) then

         break

      end if 

   end for

end procedure return list

- Hiếu Kiều -