8/3/15

Thuật toán sắp xếp: Interchange Sort (đổi chỗ trực tiếp)

Để sắp xếp một dãy, có nhiều cách làm khác nhau. Trong bài viết này mình sẽ nói về Interchange Sort, hay còn gọi là thuật toán sắp xếp đổi chỗ trực tiếp.

Ý tưởng
Ý tưởng của thuật toán này là bắt cặp tất cả các phần tử trong dãy cần sắp xếp và đổi chỗ hai phần tử trong cặp nếu chúng nghịch thế (không thỏa điều kiện thứ tự).

Để bắt cặp tất cả các phần tử trong dãy, ta dùng 2 vòng lặp. Vòng lặp ngoài sẽ chạy từ đầu dãy đến phần tử kế cuối. Vòng lặp trong sẽ chạy từ phần tử tiếp theo của vị trí đang xét ở vòng lặp ngoài. Mỗi lần xét ta sẽ so sánh 2 phần tử trong cặp. Nếu chúng nghịch thế thì sẽ hoán đổi vị trí của chúng.

Ta thấy sau mỗi lần duyệt ở vòng lặp ngoài ta sẽ được phần tử đầu tiên đứng đúng thứ tự yêu cầu. Cứ thực hiện đến hết dãy ta sẽ được một dãy đã sắp xếp

Cài đặt
Mã dưới đây được cài đặt theo ngôn ngữ C/C++ với yêu cầu sắp xếp dãy tăng dần
void InterchangeSort(int *a, int n)
{
   for (int i = 0; i < n-1; i++)
      for (int j = i+1; j < n; j++)
         if (a[i] > a[j])
         {
            int temp = a[i];
            a[i] = a[j];
            a[j] = temp;
         }
}

Đánh giá
Số phép so sánh của thuật toán này không đổi, không phụ thuộc tình trạng ban đầu của dãy. Phần tử thứ i được so sánh với n-i phần tử còn lại nên có thể ước lượng số phép so sánh bằng: (n-1) + (n-2) + ... + 1 = n(n - 1)/2.

Tuy nhiên số phép hoán vị (3 phép gán) lại phụ thuộc tình trạng ban đầu. Trong trường hợp tốt nhất, tức dãy đã được sắp xếp hoàn toàn thì không cần phải hoán vị, nên số phép hoán vị là: 0.
Trường hợp xấu nhất, tức dãy có thứ tự ngược với yêu cầu. Mỗi lần so sánh ta lại phải hoán vị nên số phép hoán vị là: n(n - 1)/2.

Độ phức tạp của thuật toán này là: O(n²)

6 nhận xét:

  1. Cho 2 số nguyên a&b .hãy hoán đổi 2 số nguyên đó theo yêu cầu:xác định bài toán,ý tưởng,xây dựng thuật toán bằng liệt kê và sơ đồ khối.
    Bài này làm như nào ạ

    Trả lờiXóa
  2. cho em hỏi là tại sao vòng for thứ nhất là i= n-1 ạ

    Trả lờiXóa
    Trả lời
    1. vd cho 5 số: 5 4 3 2 1
      nó sẽ sắp xếp từ 5->1
      khi nó sắp được 4 con, thì chắc chắn con cuối sẽ lớn nhất

      Xóa
  3. cái này khác gì nổi bọt

    Trả lờiXóa
    Trả lời
    1. nổi bọt là sắp xếp giữa a[j] và a[j-1]
      còn đổi chỗ trực tiếp sắp xếp giữa a[i] và a[j]
      Nếu không khác gì thì gộp 2 thuật toán lại đi chứ tạo 2 cái làm gì bạn

      Xóa
  4. Nặc danh13:52 8/6/21

    AD giúp e với,dùng thuật toán đổi chỗ trực tiếp (InterchangeSort) để thực hiện sắp xếp 1 mảng bất kỳ,tăng dần và giảm dần . Nhập 1 số bất kỳ từ bàn phím và kiểm tra xem số đó có trong mảng hay không ?Nếu không có thực hiện chèn vào mảng và sắp xếp tăng dần,giảm dần

    Trả lờiXóa