Cho dãy X = {X1, X1, ..., Xn}, hãy sắp xếp dãy theo chiều không giảm.
2. Ý tưởng
- Bước 1: i=1; //Phần tử đầu tiên
- Bước 2: Lần lượt so sánh và đổi chổ (nếu cần) từ phải sang trái đối với các phần từ từ X[n] đến X[i]
- Bước 3: i=i+1
- Bước 4:
* Nếu i < n, quay lại Bước 2.
* Ngược lại, dừng, dãy đã cho đã sắp xếp đúng vị trí.
4. Mã ngôn ngữ C
void BubbleSort(int X[], int n) { int i, j; for (i=0, i<n-1, i++) for (j=n-1, j>i, j--) if (X[j]<X[j-1]) swap(X[j-1],X[j]); }
5. Ví dụ
X = {7, 2, 5, 4, 1, 3, 8, 6}
Dãy ban đầu: 7, 2, 5, 4, 1, 3, 8, 6
i=1, j=8, swap(X[j-1],X[j], ta có 7, 2, 5, 4, 1, 3, 6, 8
i=1, j=7, không đổi chổ, ta có 7, 2, 5, 4, 1, 3, 6, 8
i=1, j=6, không đổi chổ, ta có 7, 2, 5, 4, 1, 3, 6, 8
i=1, j=5, swap(X[j-1],X[j], ta có 7, 2, 5, 1, 4, 3, 6, 8
i=1, j=4, swap(X[j-1],X[j], ta có 7, 2, 1, 5, 4, 3, 6, 8
i=1, j=3, swap(X[j-1],X[j], ta có 7, 1, 2, 5, 4, 3, 6, 8
i=1, j=2, swap(X[j-1],X[j], ta có 1, 7, 2, 5, 4, 3, 6, 8
i=2, thực hiện tương tự ta có 1, 2, 7, 3, 5, 4, 6, 8
i=3, thực hiện tương tự ta có 1, 2, 3, 7, 4, 5, 6, 8
i=4, thực hiện tương tự ta có 1, 2, 3, 4, 7, 5, 6, 8
i=5, thực hiện tương tự ta có 1, 2, 3, 4, 5, 7, 6, 8
i=6, thực hiện tương tự ta có 1, 2, 3, 4, 5, 6, 7, 8
i=7, thực hiện tương tự ta có 1, 2, 3, 4, 5, 6, 7, 8
Cuối cùng ta có 1, 2, 3, 4, 5, 6, 7, 8, dãy đã được sắp xếp.
6. Đánh giá giải thuật
7.Nhận xét
*Bubble Sort có các khuyết điểm sau: không nhận diện được tình trạng dãy đã có thứ tự hay có thứ tự từng phần. Các phần tử nhỏ được đưa về vị trí đúng rất nhanh, trong khi các phần tử lớn lại được đưa về vị trí đúng rất chậm.
*Thuật toán Shake Sort là thuât toán cải tiến từ Bubble Sort để khắc phục khuyết điểm của Bubble Sort.
Các thuật toán sắp xếp khác:
0 nhận xét:
Đăng nhận xét
Click to see the code!
To insert emoticon you must added at least one space before the code.