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

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ố.

Lập trình
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á

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

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].