Chuyển đến nội dung chính

Shaker Sort

Shaker Sort hay còn được gọi là thuật toán sắp xếp Cocktail, đây là một thuật toán cải tiến của thuật toán Bubble Sort.
Shaker Sort sau khi đưa phần tử nhỏ/lớn nhất lên đầu dãy, sau đấy lại đưa phần tử lớn/nhỏ nhất về cuối dãy. Như vậy, trong một lần duyệt, Shaker sort sẽ đưa ít nhất hai số  về đúng với vị trí của nó. Giả sử ta xét mảng gồm các phần tử {6; 7; 8; 9 ;0}
Với Shaker Sort trong một lần duyệt, các phần tử đã trở về đúng vị trí của nó: {0;6;7;8;9}. Tuy nhiên, đối với Bubble sort ta cần tới 4 lần duyệt để đưa các phần tử về đúng vị trí. Vậy đối với một số mảng đã gần như có thứ tự, Shaker Sort sẽ chạy nhanh hơn so với Bubble Sort. Nếu như ta xét các mảng sinh các số ngẫu nhiên thì thời gian chạy của hai thuật toán này là tương đương nhau.


THIẾT KẾ THUẬT TOÁN 

void swap(int &a, int &b) {
int i = a;
a = b;
b = i;
return;
}


void shakersort(int a[], int n) {
int l, r, k;
r = n - 1;
l = 0;
k = 0;
while(l<r) {
for (int i = l; i < r; i++) {
if (a[i] > a[i + 1]) {
k = i;
swap(a[i], a[i + 1]); // đổi chỗ hai phần tử a[i] và a[i-1]
}
}
r = k;
for (int i = r; i > l; i--) {
if (a[i] < a[i - 1]) {
k = i;
swap(a[i], a[i - 1]);// đổi chỗ hai phần tử a[i] và a[i-1]
}
}
l = k;
}
return;
}
Kết luận: Như vậy, chỉ cần với số lần duyệt ít hơn đã có thể sắp xếp các phần tử về đúng thứ tự ta muốn. Mặc dù xét về độ phức tạp thì Bubble sort và Shaker Sort gần như tương đương nhau. Tuy nhiên, trong một số trường hợp, rõ ràng thuật toán Shaker sort có thời gian chạy nhanh hơn nhiều so với Bubble sort điển hình như ví dụ trên mình đã cho các bạn xem.

Nhận xét

Bài đăng phổ biến từ blog này

Interchange Sort

Trong bài này chúng ta sẽ cùng nhau nói về một thuật toán sắp xếp lâu nhất, các bạn xem để biết chứ mình không khuyến cáo các bạn dùng thuật toán này. Mình nói về nó bởi vì  thuật toán này do các cụ đi trước đã nghĩ ra... nên mình nghĩ các bạn cũng nên biết một tí xíu. thuật toán này tên là Interchange Sort vietsub lại là: Thuật toán đổi chỗ trực tiếp. Ý tưởng chính của giải thuật là xuất phát từ đầu dãy, tìm tất cả nghịch thế chứa phần tử này, triệt tiêu chúng bằng cách đổi chổ phần tử này với phần tử tương ứng trong cặp nghịch thế. Lặp lại xử lý trên với các phần tử kế tiếp theo trong dãy. Giải thuật: Để xây dựng thuật toán này ta phải có thêm một hàm đổi chỗ 2 số nghịch thế! void Sapxep ( 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 ] ) swap ( a [ i ] , a [ j ] ) ; } Hàm đổi chỗ 2 phần tử (Swap). void swap ( int &

BUBBLE SORT (Sắp xếp nổi bọt)

Chào mọi người! Lâu rồi ta không gặp nhau. Hôm nay mình sẽ đến một thuật toán sắp xếp đơn giản: Bubble Sort (Sắp xếp nổi bọt). Nói chung ý tưởng của giải thuật này là so sánh các phần tử đứng trước nó nếu tụi nó nghịch thế thì mình đổi chỗ tụi nó. Hay nói cách khác: Giả sử cho mảng a có n phần tử và yêu cầu sắp xếp tăng dần. đầu tiên ta sẽ so sánh hai phần tử n và n-1 nếu phần tử thứ n-1 > n thì ta đổi chỗ sau đó ta tiếp tục so sánh phần tử n-1 với phần tử n-2 tương tự cho tới phần tử thứ hai so sánh với phần tử thứ nhất. Thôi bỏ qua lằng nhằn này, giờ mình đi đến cái CODE nè. Mã này viêt bằng C++: void swap(int &a, int &b) { int i = a; a = b; b = i; return; } void bubblesort(int a[], int n) { for (int i = 0; i < n - 2; i++) { for (int j = n-1; j > i; j--) { if (a[j] < a[j - 1]) swap(a[j], a[j - 1]); } } return; } Ở trong bài code này, ta thấy được rằng ta có thể giảm bớt vòng lặp, khi trong vòng lặp mà không có phần tử nào bị đổi