SELECTION SORT: Thuật toán sắp xếp chọn

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

Tiếp tục series hướng dẫn học thuật toán giúp nâng cao trình độ, kỹ năng lập trình. Hôm nay chúng ta cùng tìm hiểu tiếp về một thuật toán cũng khá đơn giản là SELECTION SORT.

1. SELECTION SORT là gì?


Thuật toán Selection Sort (Sắp xếp chọn)


Thuật toán Selection Sort (Sắp xếp chọn)

 
Selection Sort (sắp xếp chọn) là một thuật toán sắp xếp đơn giản dựa trên so sánh tại chỗ, trong đó:

  • Danh sách được chia thành hai phần (Trái - Phải) (Vẫn là cùng một mảng nhé)
  • Phần được sắp xếp ở đầu bên trái và phần chưa được sắp xếp ở đầu bên phải
  • Lúc đầu thì phần bên phải là toàn bộ danh sách. (Vì phần bên trái chưa sắp xếp mà)
  • Mỗi lần lặp chúng ta sẽ liên tục tìm giá trị nhỏ nhất ở phần bên phải, hoán đổi vị trí của nó cho phần tử ngoài cùng bên trái.


Quá trình này tiếp tục di chuyển qua lại mảng chưa được sắp xếp bởi một phần tử sang phải.

Ý tưởng của thuật toán này cũng đơn giản không kém sắp xếp nổi bọt:

 

  • Giả sử, ta chọn được phần tử có giá trị nhỏ nhất nhất trên mảng là A[k]. với vị trí là k.
  • Tráo đổi A[0] với A[k], vậy thì lúc này ta sẽ nhận được A[0] là phần tử có giá trị nhỏ nhất.
  • Giả sử đến bước thứ i ta đã có A[0] <= A[1] <= ... <= A[i-1]. Bây giờ ta cần tìm thành phần có giá trị nhỏ nhất trong các phần tử từ A[i] đến A[n-1].
  • Giả sử phần tử đó có vị trí là t có giá trị A[t] sao cho i <= t <= n - 1
  • Ta lại tráo đổi A[i] với A[t]. Lặp lại cho tới i = n - 1
  • Cuồi cùng, ta có mảng A được sắp xếp.


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.

Khi bạn sắp xếp với một cơ sở dữ liệu lớn thì quá trình này sẽ chậm và tốn nhiều bộ nhớ máy tính.


Độ phức tạp của selection sort là: O(n2)

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


2.1. Giải thuật Selection Sort


Để bạn dần hiểu rõ hơn về thuật toán Selection Sort, hãy xem giải thuật của nó:

  • Bước 1: Chọn phần tử có khóa nhỏ nhất trong n phần tử từ a[0] đến a[n-1] và hoán vị nó với phần tử a[0].
  • Bước 2: Chọn phần tử có khóa nhỏ nhất trong n – 1 phần tử từ a[1] đến a[n-1] và hoán vị nó với a[1].
  • Tổng quát ở bước thứ i chọn phần tử có khóa nhỏ nhất trong n – i phần tử từ a[i] đến a[n-1] và hoán vị nó với a[i].

Sau n – 1 bước thì mảng đã được sắp xếp.

2.2. Phương pháp chọn khóa hoặc phần tử đầu tiên


Ý tưởng và giải thuật là thế, nhưng mình biết rằng có rất nhiều bạn chưa hình dung ra đâu, vì thế, hãy đi sâu hơn về cách làm. Phương pháp chọn key hoặc phần tử đầu tiên:

  • Bước 1: Đầu tiên ta đặt khóa nhỏ nhất là khóa của a[i] (lowkey = a[i]key) và chỉ số của phần tử có khóa nhỏ nhất là là i (lowindex = i).

  • Bước 2: Xét các phần tử a[j] với j từ i + 1 đến n -1, nếu khóa của a[j] nhỏ hơn khóa nhỏ nhất (a[j].key < lowkey) thì đặt lại khóa nhỏ nhất là là khóa của a[j] (lowkey = a[j].key). Và phần tử có khóa nhỏ nhất là j (lowendex = j).

  • Bước 3: Khi đã xét hết các phần tử a[j] với j > n- 1 thì phần tử có khóa nhỏ nhất là a[lowindex]


Ví dụ, ta có một mảng như thế này:

Ví dụ minh họa thuật toán Selection Sort: Mảng ban đầu
 
  • Tìm phần tử nhỏ nhất trong arr [0 ... 4] và đặt nó ở đầu (Hoán đổi giá trị với phần tử đầu arr [0 ... 4]

Ví dụ minh họa thuật toán Selection Sort: 2
 
  • Tìm phần tử nhỏ nhất trong arr [1 ... 4] và đặt nó ở đầu arr [1 ... 4]

Ví dụ minh họa thuật toán Selection Sort: 3
 
  • Tìm phần tử nhỏ nhất trong arr [2 ... 4] và đặt nó ở đầu arr [2 ... 4]

Ví dụ minh họa thuật toán Selection Sort: 4
 
  • Tìm phần tử nhỏ nhất trong arr [3 ... 4] và đặt nó ở đầu arr [3 ... 4]

Ví dụ minh họa thuật toán Selection Sort: 5
 

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


Từ ý tưởng và mô tả của phần 2 – bây giờ chúng ta cùng nhau triển khai, chuyển chúng sang chương trình Java và thực thi xem kết quả có như mong đợi không nhé.


package selection.sort.algo;

public class SelectionSort {
    void sort(int arr[]) {
        int n = arr.length;

        // Duyệt qua từng phần tử của mảng
        for (int i = 0i < n - 1i++) {

            // Tìm phần tử nhỏ nhất trong mảng chưa được sắp xếp
            int min_idx = i;
            for (int j = i + 1j < nj++)
                if (arr[j] < arr[min_idx])
                    min_idx = j;

            // Hoán đổi phần tử nhỏ nhất và phần tử đầu tiên
            int temp = arr[min_idx];
            arr[min_idx] = arr[i];
            arr[i] = temp;
        }
    }

    // Xuất mảng
    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[]) {
        SelectionSort ob = new SelectionSort();
        int arr[] = { 6425122211 };
        System.out.println("Mảng ban đầu:");
        ob.printArray(arr);
        ob.sort(arr);
        System.out.println("Mảng sau khi sắp xếp:");
        ob.printArray(arr);
    }
}
 


Khi chạy chương trình, ta có kết quả:


Mảng ban đầu:
64 25 12 22 11
Mảng sau khi sắp xếp:
11 12 22 25 64
 


Trong thực tế, chúng ta không cần tạo một danh sách mới cho các phần tử được sắp xếp, những gì chúng ta làm là coi phần ngoài cùng bên trái của danh sách là phân đoạn được sắp xếp.

Sau đó chúng ta tìm kiếm phần tử nhỏ nhất trong toàn bộ danh sách đã cho và hoán đổi nó với phần tử đầu tiên.
 
Thuật toán Selection Sort là một trong những thuật toán đơn giản nhất, dễ học và cũng dễ vận dụng vào các dự án thực tế.

Tuy nhiên đừng nghĩ rằng nó đơn giản mà bỏ qua trong quá trình học lập trình, hãy tìm hiểu và tập luyện thật tốt các thức cơ bản này để kết hợp chúng lại vào các thuật toán phức tạp và đồ sộ hơn trong môi trường dự án lớn.

> Tại KHÓA HỌC LẬP TRÌNH (Full Stack) của NIIT - ICT Hà Nội bạn không chỉ được chú trọng về thuật toán mà còn được học "Cách học thuật toán", cách xử lý vấn đề tốt hơn trong lập trình.

Bạn am hiểu thuật toán càng nhiều sẽ tăng giá trị của bạn trong mắt nhà tuyển dụng – đặc biệt là các bạn lần đầu đi phỏng vấn xin việc.

Hãy cân nhắc và chuẩn bị thật kỹ 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!