Thuật toán sắp xếp cocktail

(Đổi hướng từ Sắp xếp sàng lắc)

Thuật toán sắp xếp cocktail là một cải tiến của Bubble Sort. Sau khi đưa phần tử nhỏ nhất về đầu dãy, thuật toán sẽ giúp chúng ta đưa phần tử lớn nhất về cuối dãy. Do đưa các phần tử về đúng vị trí ở cả hai đầu nên thuật toán sắp xếp cocktail sẽ giúp cải thiện thời gian sắp xếp dãy số.

Thuật toán sắp xếp cocktail
Visualization of shaker sort
Phân loạiThuật toán sắp xếp
Cấu trúc dữ liệuArray
Hiệu suất trường hợp tệ nhất
Hiệu suất trường hợp tốt nhất
Hiệu suất trung bình
Độ phức tạp không gian trường hợp tệ nhất
Tối ưuNo

Lập trình

sửa
void ShakerSort(int a[], int n)
{
    int Left = 0;
    int Right = n - 1;
    int k = 0;
    int i;
    while (Left < Right)
    {
        for (i = Left; i < Right; i++)
        {
            if (a[i] > a[i + 1])
            {
                swap(a[i], a[i + 1]);
                k = i;
            }
         }
        Right = k;
        for (i = Right; i > Left; i--)
        {
            if (a[i] < a[i - 1])
            {
                swap(a[i], a[i - 1]);
                k = i;
            }
        }
        Left = k;
    }
}

Đánh giá

sửa

Như trên tôi đã nói Thuật toán sắp xếp cocktail là một dạng nâng cao của Bubble Sort nên nó có thể nhận biết được mảng đã được sắp xếp.

Độ phức tạp cho trường hợp tốt nhất là O(n). Độ phức tạp cho trường hợp xấu nhất O(n2). Độ phức tạp trong trường hợp trung bình là O(n2). Thuật toán nhận diện được mảng đã sắp xếp.

Kết luận

sửa

Trong trường hợp mảng có các phần tử là [2, 3, 4, 5, 1] thì đối với Thuật toán sắp xếp cocktail chỉ cần 1 lần duyệt là đã đưa các phần tử của mảng về đúng vị trí, còn với Bubble Sort cần tới 4 lần duyệt để đưa các phần tử về đúng vị trí. Tuy nhiên, trong trường hợp mảng có ngẫu nhiên phần tử với thứ tự đảo lộn thì Bubble Sort và Thuật toán sắp xếp cocktail cho thời gian sắp xếp gần tương đương nhau.

Vì vậy, ta có thể nói rằng Thuật toán sắp xếp cocktail ưu thế hơn Bubble Sort trong trường hợp các phần tử trong mảng đã gần có thứ tự như trong ví dụ trên là mảng [2, 3, 4, 5, 1].