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

Ngày đăng: 03/09/2020   -    Cập nhật: 23/10/2020


Để bắt đầu với Series bài học về thuật toán, hôm nay chúng ta cùng tìm hiểu một thuật toán đơn giản đó là thuật toán Bubble sort.

1. Giới thiệu về thuật toán Bubble Sort


Thuật toán Bubble sort (Sắp xếp nổi bọt)

Thuật toán Bubble sort (Sắp xếp nổi bọt)

Bubble Sort (Sắp xếp nổi bọt) là một thuật toán sắp xếp đơn giản, với thao tác cơ bản là so sánh hai phần tử kề nhau, nếu chúng chưa đứng đúng thứ tự thì đổi chỗ (swap).

Có thể tiến hành từ trên xuống (bên trái sang) hoặc từ dưới lên (bên phải sang).

Sắp xếp nổi bọt còn có tên gọi khác là sắp xếp bằng so sánh trực tiếp. Nó sử dụng phép so sánh các phần tử nên là một giải thuật sắp xếp kiểu so sánh.


  • Sắp xếp từ trái sang (Từ trên xuống)

Thuật toán sắp xếp nổi bọt: Từ trái sang

Thuật toán sắp xếp nổi bọt: Từ trái sang

Giả sử dãy cần sắp xếp có n phần tử.

Khi tiến hành từ trên xuống, ta so sánh hai phần tử đầu ở bên trái mảng.

Nếu phần tử đứng trước lớn hơn phần tử đứng sau thì đổi chỗ chúng cho nhau.

Tiếp tục làm như vậy với cặp phần tử thứ hai và thứ ba và tiếp tục cho đến cuối tập hợp dữ liệu.

Nghĩa là so sánh (và đổi chỗ nếu cần) phần tử thứ n - 1 với phần tử thứ n.

Sau bước này phần tử cuối cùng chính là phần tử lớn nhất của dãy.

Sau đó, quay lại so sánh (và đổi chố nếu cần) hai phần tử đầu cho đến khi gặp phần tử thứ n - 2....

Lưu ý: Nếu trong một lần duyệt, không phải đổi chỗ bất cứ cặp phần tử nào thì danh sách đã được sắp xếp xong.


  • Sắp xếp từ phải sang (Từ bên dưới lên)

Thuật toán sắp xếp nổi bọt: Từ phải sang

Thuật toán sắp xếp nổi bọt: Từ phải sang

Sắp xếp từ phải sang so sánh (và đổi chỗ nếu cần) bắt đầu từ việc so sánh cặp phần tử thứ n - 1n.

Tiếp theo là so sánh cặp phần tử thứ n - 2n - 1,... cho đến khi so sánh và đổi chỗ cặp phần tử thứ nhất và thứ hai.

Sau bước này phần tử nhỏ nhất đã được nổi lên vị trí trên cùng.

Việc này giống như hình ảnh của các "bọt" khí nhẹ hơn được nổi lên trên.

Chính vì thế, đây được gọi là thuật toán sắp xếp nổi bọt.

Tiếp theo tiến hành với các phần tử từ thứ 2 đến thứ n.

Độ phức tạp của giải thuật : O(n2)



2. Ý tưởng và Mô tả thuật toán Bubble sort


Ví dụ ta có một mảng các số không theo thứ tự  5 1 4 2 8 thì sử dụng thuật toán Bubble Sort để tiến hành việc sắp xếp sẽ như thế nào?

Ví dụ thuật toán Bubble sort

Ví dụ thuật toán Bubble sort

Hãy xem phần mô tả thô bên dưới.

Tại lần lặp thứ 1:


  • Thuật toán so sánh hai phần tử đầu tiên và hoán đổi vị trí cho nhau vì 5 > 1

Ví dụ thuật toán Bubble sort: Lần lặp thứ 1.1
 
  • Hoán đổi vị trí 5 và 4 cho nhau vì 5 > 4

Ví dụ thuật toán Bubble sort: Lần lặp thứ 1.2
 
  • Hoán đổi vị trí 5 và 2 cho nhau vì 5 > 2
 
Ví dụ thuật toán Bubble sort: Lần lặp thứ 1.3
 
  • So sánh 2 phần tử cuối thấy 8 > 5 nên không thay đổi vị trí

Tại lần lặp thứ 2:


  • Lần lặp thứ 2, so sánh 2 phần tử đầu tiên thấy 1 < 4 nên không hoán đổi vị trí của chúng.

  • Hoán đổi vị trí của 4 và 2 cho nhau vì 4 > 2.

Ví dụ thuật toán Bubble sort: Lần lặp thứ 2
 
  • Tiếp theo, so sánh thấy 4 < 5 nên không thay đổi vị trí
  • So sánh thấy 5 < 8 nên không thay đổi vị trí

Bây giờ, mảng đã được sắp xếp, nhưng thuật toán của chúng ta không biết liệu nó đã hoàn thành hay chưa.

Thuật toán cần một lần lặp qua toàn bộ mà không có bất kỳ sự hoán đổi nào để biết nó được là đã sắp xếp thành công.

Tại lần lặp thứ 3:


Ví dụ thuật toán Bubble sort: Lần lặp thứ 3
 
  • Như bạn thấy ở hình minh họa trên. Lần lặp thứ 3 này, chương trình kiểm tra 2 phần tử liền kề của mảng nhưng không cần phải thay đổi vị trí lần nào.
 

3. Triển khai thuật toán Bubble sort trong Java

Bạn đã hiểu về ý tưởng của thuật toán Bubble sort. Bây giờ, chúng ta hãy cùng nhau triển khai ý tưởng đó thành code xem như thế nào nhé.


package bubble.sort.algo;

public class BubbleSort {

    // Hàm sắp xếp nổi bọt
    void bubbleSort(int arr[]) {
        int n = arr.length;
        for (int i = 0i < n - 1i++)
            for (int j = 0j < n - i - 1j++)
                if (arr[j] > arr[j + 1]) {
                    // swap arr[j+1] và arr[i]
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
        }
    }

    // In các phần tử của arr
    void printArray(int arr[]) {
        int n = arr.length;
        for (int i = 0i < n; ++i)
            System.out.print(arr[i] + " ");
        System.out.println();
    }

    public static void main(String args[]) {
        BubbleSort ob = new BubbleSort();
        int arr[] = { 51428 };
        System.out.println("Mảng ban đầu:");
        ob.printArray(arr);
        ob.bubbleSort(arr);
        System.out.println("Mảng sau khi sắp xếp:");
        ob.printArray(arr);
    }
}
 

Khi chạy chương trình ta có:


Mảng ban đầu:
5, 1, 4, 2, 8
Mảng sau khi sắp xếp:
1, 2 , 4, 5, 8
 

Phần code bên trên (tức hàm bubbleSort) luôn chạy với thời gian là O(n^2) ngay cả khi mảng được sắp xếp.

Nó có thể được tối ưu hóa bằng cách dừng thuật toán nếu vòng lặp bên trong mà không gây ra bất kỳ sự hoán đổi nào.



package bubble.sort.algo;

public class BubbleSortOptimized {
    static void bubbleSort(int arr[], int n) {
        int ijtemp;
        boolean swapped;
        for (i = 0i < n - 1i++) {
            swapped = false;
            for (j = 0j < n - i - 1j++) {
                if (arr[j] > arr[j + 1]) {
                    // swap arr[j] và arr[j+1]
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    swapped = true;
                }
            }

            // Nếu không có phần tử nào để hoán đổi
            // bên trong vòng lặp thì Break
            if (swapped == false)
                break;
        }
    }

    // In các phần tử của mảng
    static void printArray(int arr[], int size) {
        int i;
        for (i = 0i < sizei++)
            System.out.print(arr[i] + " ");
        System.out.println();
    }

    public static void main(String args[]) {
        int arr[] = { 51428 };
        int n = arr.length;
        System.out.println("Mảng ban đầu:");
        printArray(arrn);
        bubbleSort(arrn);
        System.out.println("Mảng sau khi sắp xếp:");
        printArray(arrn);
    }
}
 

4. Tổng kết


Do tính đơn giản của nó, sắp xếp nổi bọt thường được sử dụng để giới thiệu khái niệm về thuật toán sắp xếp.

Mặc dù là giải thuật khá chậm trong số các thuật toán sắp xếp nhưng thuật toán Bubble Sort vẫn luôn có chỗ đứng trong việc giải quyết các vấn đề thực tế.

Chẳng hạn như việc phát hiện một lỗi rất nhỏ (như hoán đổi chỉ hai phần tử) trong các mảng gần như được sắp xếp và sửa nó chỉ với độ phức tạp tuyến tính (2n) trong đồ hoạ máy tính.

Đây là thuật toán mở đầu cho phần chia sẻ của mình trong Series này.

Hy vọng nó mang đến hứng thú và hữu ích với các bạn trong quá trình tìm hiểu về thuật toán, đặc biệt là với những bạn đang học Java.

> Nếu bạn đang tự học Java mà cảm thấy khó khăn thì KHÓA HỌC JAVA WEB (Full Stack) này có lẽ sẽ giúp bạn học tốt hơn. Tham khảo ngay nhé.


---
HỌC VIỆN ĐÀO TẠO CNTT NIIT - ICT HÀ NỘI
Học Lập trình chất lượng cao (Since 2002). Học làm Lập trình viên. Hành động ngay!
Đc: Tầng 3, 25T2, N05, Nguyễn Thị Thập, Cầu Giấy, Hà Nội
SĐT: 02435574074 - 0914939543
Email: hello@niithanoi.edu.vn
Fanpage: https://facebook.com/NIIT.ICT/
 
#niit #niithanoi #niiticthanoi #hoclaptrinh #khoahoclaptrinh #hoclaptrinhjava #hoclaptrinhphp #java #php #python
Bình luận Facebook
Đăng ký tư vấn
Nhân viên gọi điện tư vấn miễn phí sau khi đăng ký
Được cập nhật các ưu đãi sớm nhất
Hotline: 0383180086
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Hãy đăng ký để nhận những thông tin mới nhất về học bổng mới nhất tại NIIT - ICT Hà Nội
top
Đóng lại Đăng ký học tại NIIT - ICT Hà Nội
6260+ học viên đã theo học tại NIIT - ICT Hà Nội và có việc làm tốt trong ngành lập trình. Nắm lấy cơ hội ngay hôm nay!
Chọn khóa học
  • KHÓA HỌC LẬP TRÌNH FRONT END VỚI REACT.JS
  • KHÓA HỌC LẬP TRÌNH PHP WEB
  • Khóa học PHP Full stack [2023] cho người mới bắt đầu
  • Khóa học BIG DATA với Hadoop và Spark
  • Khóa học Lập trình Android tại Hà Nội
  • [Tuyển sinh 2023] Lập trình viên Quốc tế DigiNxt
  • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại Hà Nội
  • LẬP TRÌNH GAME
    • Khóa học Lập trình Game Unity
  • LẬP TRÌNH WEB FRONT END
    • KHÓA HỌC PYTHON HƯỚNG ĐỐI TƯỢNG
    • KHÓA HỌC ANGULAR & TYPESCRIPT (FRONT END)
  • LẬP TRÌNH WEB BACK END
    • LẬP TRÌNH JAVA WEB VỚI FRAME WORK
    • Lập trình Web với Django
    • Lập trình PHP với Laravel Framework
  • CHƯƠNG TRÌNH ĐÀO TẠO ỨNG DỤNG CÔNG NGHỆ
    • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại TP HCM
  • LẬP TRÌNH WEB FULL STACK
    • Khóa học Java Full stack (IJFD)
  • LẬP TRÌNH MOBILE
    • FRONT-END VỚI REACTJS VÀ REACT NATIVE
    • Lập trình Android Nâng cao
  • ĐÀO TẠO CHO DOANH NGHIỆP
    • KHÓA HỌC BUSINESS ANALYSIC TỪ CƠ BẢN ĐẾN NÂNG CAO 2023
    • Khóa học Magento: Làm chủ CMS TMĐT lớn nhất
    • Khóa học IOT: Xây dựng Sản phẩm IOT với Raspberry Pi
    • Khóa học Automation Testing Chuyên nghiệp
  • KHÓA HỌC DỰ ÁN
    • Học sử dụng bộ Office: Word, Excel, Power Point, Mail chuyên nghiệp
  • KHÓA HỌC KHÁC
    • VBA Excel Toàn Tập (Cơ Bản - Nâng Cao)
    • VBA Excel Nâng cao
    • Khóa học JMeter: Performance Testing
    • Khóa học Tester đạt chuẩn Quốc tế ISTQB Foundation Level
    • Khoá Học Tester đạt chuẩn quốc tế ISTQB Advanced Level
Bạn chưa chọn khóa học cần đăng ký
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Đăng ký học thành công!
Cảm ơn bạn đã đăng ký học tại NIIT - ICT HÀ NỘI!