Thuật toán sắp xếp chọn (Selection Sort) là một thuật toán sắp xếp đơn giản và trực quan, hoạt động bằng cách tìm phần tử nhỏ nhất (hoặc lớn nhất, tùy thuộc vào thứ tự sắp xếp) trong dãy chưa được sắp xếp và chuyển nó vào vị trí đúng trong dãy đã sắp xếp. Dưới đây là hướng dẫn chi tiết về thuật toán sắp xếp chọn, bao gồm cách hoạt động và mã PHP minh họa.

1. Giới thiệu

Thuật toán Sắp xếp Chọn:

  • Tìm phần tử nhỏ nhất trong danh sách chưa được sắp xếp.
  • Đổi chỗ phần tử nhỏ nhất với phần tử đầu tiên trong danh sách chưa sắp xếp.
  • Lặp lại các bước trên cho phần còn lại của danh sách cho đến khi toàn bộ danh sách được sắp xếp.

2. Quy Trình

  1. Bắt đầu từ đầu danh sách: Xem phần tử đầu tiên như là phần tử đã sắp xếp và phần còn lại là danh sách chưa sắp xếp.
  2. Tìm phần tử nhỏ nhất trong phần chưa sắp xếp.
  3. Đổi chỗ phần tử nhỏ nhất với phần tử đầu tiên trong phần chưa sắp xếp.
  4. Di chuyển chỉ số bắt đầu của phần đã sắp xếp sang phải và lặp lại bước 2 cho phần còn lại.

3. Thuật Toán và Mã PHP

Thuật toán Sắp xếp Chọn:

  1. Duyệt từ đầu danh sách đến phần cuối.
  2. Với mỗi phần tử, tìm phần tử nhỏ nhất trong phần chưa sắp xếp.
  3. Đổi chỗ phần tử nhỏ nhất với phần tử đầu tiên trong phần chưa sắp xếp.

Mã PHP:

function selectionSort($array) {
    $n = count($array);

    // Duyệt qua toàn bộ danh sách
    for ($i = 0; $i < $n - 1; $i++) {
        // Tìm chỉ số phần tử nhỏ nhất trong phần chưa sắp xếp
        $minIndex = $i;
        for ($j = $i + 1; $j < $n; $j++) {
            if ($array[$j] < $array[$minIndex]) {
                $minIndex = $j;
            }
        }

        // Đổi chỗ phần tử nhỏ nhất với phần tử đầu tiên trong phần chưa sắp xếp
        if ($minIndex != $i) {
            $temp = $array[$i];
            $array[$i] = $array[$minIndex];
            $array[$minIndex] = $temp;
        }
    }

    return $array;
}

// Ví dụ sử dụng
$numbers = [64, 25, 12, 22, 11];
$sortedNumbers = selectionSort($numbers);

echo "Sắp xếp chọn: " . implode(", ", $sortedNumbers);

4. Phân Tích

  • Thời gian thực thi: O(n^2) trong cả trường hợp tốt nhất và tồi tệ nhất, vì thuật toán phải tìm phần tử nhỏ nhất cho mỗi vị trí trong dãy.
  • Không gian bộ nhớ: O(1) vì thuật toán sắp xếp chọn thực hiện tại chỗ (in-place sorting).

5. Ứng Dụng

  • Dữ liệu nhỏ: Thuật toán sắp xếp chọn có thể hữu ích khi làm việc với các dãy nhỏ hoặc trong các ứng dụng yêu cầu thuật toán sắp xếp đơn giản.
  • Khi yêu cầu: Thuật toán này không yêu cầu bộ nhớ bổ sung, vì vậy nó có thể được sử dụng khi bộ nhớ hạn chế.

6. Ví Dụ Minh Họa

Trước khi sắp xếp:

[64, 25, 12, 22, 11]

Sau khi sắp xếp:

[11, 12, 22, 25, 64]

Tóm tắt

Thuật toán sắp xếp chọn là một trong những thuật toán sắp xếp cơ bản và đơn giản, hoạt động bằng cách tìm phần tử nhỏ nhất trong phần chưa sắp xếp và đưa nó vào vị trí chính xác trong phần đã sắp xếp. Mặc dù có độ phức tạp thời gian cao hơn so với các thuật toán sắp xếp khác như Quick Sort hoặc Merge Sort, nó vẫn là một công cụ hữu ích trong các tình huống cụ thể và giúp nâng cao hiểu biết về các thuật toán sắp xếp cơ bản.

7. Sắp Xếp Tăng Dần và Giảm Dần

Sắp xếp tăng dầnsắp xếp giảm dần là hai yêu cầu phổ biến khi sử dụng thuật toán sắp xếp. Thuật toán sắp xếp chọn có thể dễ dàng được điều chỉnh để thực hiện cả hai loại sắp xếp này.

7.1. Sắp Xếp Tăng Dần

Đây là cách sắp xếp phổ biến nhất, trong đó các phần tử trong danh sách được sắp xếp từ nhỏ nhất đến lớn nhất.

Mã PHP để sắp xếp tăng dần:

function selectionSortAsc($array) {
    $n = count($array);

    // Duyệt qua toàn bộ danh sách
    for ($i = 0; $i < $n - 1; $i++) {
        // Tìm chỉ số phần tử nhỏ nhất trong phần chưa sắp xếp
        $minIndex = $i;
        for ($j = $i + 1; $j < $n; $j++) {
            if ($array[$j] < $array[$minIndex]) {
                $minIndex = $j;
            }
        }

        // Đổi chỗ phần tử nhỏ nhất với phần tử đầu tiên trong phần chưa sắp xếp
        if ($minIndex != $i) {
            $temp = $array[$i];
            $array[$i] = $array[$minIndex];
            $array[$minIndex] = $temp;
        }
    }

    return $array;
}

// Ví dụ sử dụng
$numbersAsc = [64, 25, 12, 22, 11];
$sortedNumbersAsc = selectionSortAsc($numbersAsc);

echo "Sắp xếp tăng dần: " . implode(", ", $sortedNumbersAsc);

7.2. Sắp Xếp Giảm Dần

Trong trường hợp này, các phần tử trong danh sách sẽ được sắp xếp từ lớn nhất đến nhỏ nhất.

Mã PHP để sắp xếp giảm dần:

function selectionSortDesc($array) {
    $n = count($array);

    // Duyệt qua toàn bộ danh sách
    for ($i = 0; $i < $n - 1; $i++) {
        // Tìm chỉ số phần tử lớn nhất trong phần chưa sắp xếp
        $maxIndex = $i;
        for ($j = $i + 1; $j < $n; $j++) {
            if ($array[$j] > $array[$maxIndex]) {
                $maxIndex = $j;
            }
        }

        // Đổi chỗ phần tử lớn nhất với phần tử đầu tiên trong phần chưa sắp xếp
        if ($maxIndex != $i) {
            $temp = $array[$i];
            $array[$i] = $array[$maxIndex];
            $array[$maxIndex] = $temp;
        }
    }

    return $array;
}

// Ví dụ sử dụng
$numbersDesc = [64, 25, 12, 22, 11];
$sortedNumbersDesc = selectionSortDesc($numbersDesc);

echo "Sắp xếp giảm dần: " . implode(", ", $sortedNumbersDesc);

8. Phân Tích và So Sánh

  • Hiệu suất: Cả hai phiên bản sắp xếp tăng dần và giảm dần đều có độ phức tạp thời gian O(n^2) trong cả trường hợp tốt nhất và tồi tệ nhất. Chúng hoạt động hiệu quả với dãy nhỏ hoặc gần như đã được sắp xếp, nhưng có thể không hiệu quả với dãy dữ liệu lớn.
  • Ứng dụng: Sắp xếp tăng dần thường được sử dụng hơn trong nhiều ứng dụng. Sắp xếp giảm dần có thể hữu ích trong các tình huống yêu cầu sắp xếp từ lớn đến nhỏ, chẳng hạn như trong việc phân tích dữ liệu, báo cáo, hoặc khi người dùng yêu cầu sắp xếp dữ liệu theo thứ tự giảm dần.

9. Tìm Kiếm Phần Tử Lớn Nhất và Nhỏ Nhất

Tìm kiếm phần tử lớn nhất và nhỏ nhất trong một mảng là các bài toán cơ bản trong lập trình và rất quan trọng trong nhiều thuật toán và ứng dụng thực tế. Dưới đây là hướng dẫn chi tiết về cách thực hiện các bài toán này bằng PHP.

9.1. Tìm Kiếm Phần Tử Nhỏ Nhất

Mục tiêu: Xác định phần tử nhỏ nhất trong một mảng.

Cách thực hiện:

  1. Khởi tạo biến: Bắt đầu bằng việc gán giá trị của phần tử đầu tiên trong mảng cho biến lưu trữ phần tử nhỏ nhất.
  2. Duyệt qua mảng: So sánh từng phần tử với biến lưu trữ phần tử nhỏ nhất.
  3. Cập nhật giá trị: Nếu tìm thấy phần tử nhỏ hơn biến lưu trữ phần tử nhỏ nhất, cập nhật biến này.

Mã PHP để tìm phần tử nhỏ nhất:

function findMin($array) {
    if (empty($array)) {
        return null; // Trả về null nếu mảng rỗng
    }

    $min = $array[0]; // Khởi tạo giá trị nhỏ nhất bằng phần tử đầu tiên

    // Duyệt qua mảng để tìm giá trị nhỏ nhất
    foreach ($array as $value) {
        if ($value < $min) {
            $min = $value;
        }
    }

    return $min;
}

// Ví dụ sử dụng
$numbers = [64, 25, 12, 22, 11];
$minNumber = findMin($numbers);

echo "Phần tử nhỏ nhất: " . $minNumber;

Giải thích:

  • empty($array): Kiểm tra nếu mảng là rỗng.
  • $min = $array[0]: Khởi tạo biến $min với phần tử đầu tiên trong mảng.
  • foreach ($array as $value): Duyệt qua từng phần tử của mảng.
  • if ($value < $min): Cập nhật giá trị của biến $min nếu phần tử hiện tại nhỏ hơn giá trị hiện tại của $min.

9.2. Tìm Kiếm Phần Tử Lớn Nhất

Mục tiêu: Xác định phần tử lớn nhất trong một mảng.

Cách thực hiện:

  1. Khởi tạo biến: Bắt đầu bằng việc gán giá trị của phần tử đầu tiên trong mảng cho biến lưu trữ phần tử lớn nhất.
  2. Duyệt qua mảng: So sánh từng phần tử với biến lưu trữ phần tử lớn nhất.
  3. Cập nhật giá trị: Nếu tìm thấy phần tử lớn hơn biến lưu trữ phần tử lớn nhất, cập nhật biến này.

Mã PHP để tìm phần tử lớn nhất:

function findMax($array) {
    if (empty($array)) {
        return null; // Trả về null nếu mảng rỗng
    }

    $max = $array[0]; // Khởi tạo giá trị lớn nhất bằng phần tử đầu tiên

    // Duyệt qua mảng để tìm giá trị lớn nhất
    foreach ($array as $value) {
        if ($value > $max) {
            $max = $value;
        }
    }

    return $max;
}

// Ví dụ sử dụng
$numbers = [64, 25, 12, 22, 11];
$maxNumber = findMax($numbers);

echo "Phần tử lớn nhất: " . $maxNumber;

Giải thích:

  • empty($array): Kiểm tra nếu mảng là rỗng.
  • $max = $array[0]: Khởi tạo biến $max với phần tử đầu tiên trong mảng.
  • foreach ($array as $value): Duyệt qua từng phần tử của mảng.
  • if ($value > $max): Cập nhật giá trị của biến $max nếu phần tử hiện tại lớn hơn giá trị hiện tại của $max.