Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 33 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
33
Dung lượng
147,5 KB
Nội dung
Nội dung
•
Giải thuật thứ hai có độ phức tạp O(n
2
) là Bubble
sort
–
Áp dụng chiến lược ngược với insertion sort
•
Ta sẽ khảo sát:
–
Giải thuật và ví dụ minh họa
–
Thời gian thực hiện
•
Trường hợp xấu nhất
•
Tốt nhất
•
Trung bình (giới thiệu về nghịch thế)
–
Tổng kết và thảo luận
Bubble Sort
•
Giả sử ta có dãy dữ liệu chưa được sắp:
–
Xuất phát từ đầu, duyệt trên dãy,tìm phần tử lớn
nhất, nổi bọt nó (bubble) về đỉnh.
–
Với mỗi bước lặp tiếp theo, tìm phần tử lớn nhất kế
tiếp và bubble nó về hướng đỉnh của dãy.
Bubble Sort
•
Bắt đầu từ phần tử đầu tiên, giả sử rằng đây là
phần tử lớn nhất.
•
So sánh nó với phần tử thứ hai:
–
Nếu phần tử thứ nhất lớn hơn, hoán đổi hai phần tử
–
Ngược lại, ta giả sử rằng phần tử thứ hai là phần tử
lớn nhất
•
Tiếp tục đi về cuối dãy, hoặc là hoán đổi hoặc là
định nghĩa lại phần tử lớn nhất.
Bubble Sort
•
Sau một lần duyệt, phần tử lớn nhất phải ở vị trí
cuối cùng của dãy.
•
Bắt đầu lại từ đầu:
–
Lần duyệt thứ hai sẽ đem phần tử lớn thứ hai về vị trí
cuối cùng thứ hai của dãy
•
Lặp lại n – 1 lần, sau đó, mọi phần tử sẽ ở đúng
vị trí của nó.
Bubble Sort: minh họa
•
Hãy xem dãy chưa được sắp
bên tay phải.
•
Chúng ta bắt đầu từ phần tử
đầu tiên và di chuyển xuôi
xuống:
–
Nếu phần tử hiện hành và
phần tử kế có thứ tự , tiếp tục
với phần tử tiếp theo; nếu
ngược lại
–
Hoán đổi hai phần tử
Bubble Sort: minh họa
•
Sau một lần lặp, phần tử lớn
nhất đã ở vị trí cuối cùng của
dãy
•
Lặp lại tiến trình
Bubble Sort: minh họa
•
Hiện tại hai phần tử lớn đã
nằm ở cuối dãy
•
Lặp lại tiến trình
5
12
Bubble Sort: minh họa
•
Sau cùng, chúng ta hoán
đổi hai vị trí cuối để sắp
thứ tự chúng.
Đến đây, ta đã có
dãy được sắp
Bubble Sort: Cài đặt
void BubbleSort(int array[] , int n )
{
for (int i=n-1 ; i>0 ; i )
for ( int j=0 ; j<i ; j++ )
if ( array[j] > array[j+1] )
Swap ( array[j] , array[j+1] ) ;
}
Phân tích giải thuật
•
Vòng lặp đầu tiên ta phải mất n – 1 phép so sánh
•
Số lần hoán đổi nhiều nhất cũng chỉ là n – 1.
•
Tổng các phép so sánh là:
( )
( )
2
1
1
1
1
nn
nnkn
n
k
−
−−=−
∑
−
=
Trường hợp xấu nhất
[...]...Phân tích giải thuật Trường hợp xấu nhất • Kết luận, trường hợp xấu nhất của bubble sort là O(n2) • Trường hợp trung bình thì không khác: dạng của giải thuật cần O(n2) phép so sánh • Thông thường sau một số hữu hạn bước ta nhận thấy dãy đã có thứ tự Bubble Sort có cờ • Xét một biến thể của giải thuật như sau: – Với mỗi bước ta duy trì một cái cờ để ghi... cờ: Cài đặt void FlaggedBubbleSort(int array[], int n ) { int i = n-1 ; char ok ; do { ok = 0 ; // false for ( j = 0 ; j < i ; j++ ) if ( array[j] < array[j+1] ) { Swap (array[j], array[j+1]); ok = 1 //true } i ; } while (ok) ; } Phân tích Flagged Bubble Sort trường hợp tốt nhất • Giả sử rằng dãy đã được sắp • Tình huống này, sau một lần duyệt, không có sự hoán đổi xảy ra, giải thuật kết thúc • Do đó,... dãy có thứ tự ngược • Tình huống này, mỗi phép so sánh cần một sự hoán đổi, do đó giải thuật không thể kết thúc sớm được • Thời gian thực hiện trong trường hợp xấu nhất sẽ là O(n2) Phân tích Flagged Bubble Sort trường hợp trung bình • Xác định thời gian chạy trung bình thì khó hơn, do ta không chắc chắn khi nào giải thuật kết thúc • Ta cần một cách khác cho phép ta đếm được số các hoán đổi xảy ra • Nếu... tổng kết thời gian chạy của bubble sort Truờng hợp Run Time Xấu nhất Trung bình Tốt nhất O(n2) O(n2) O(n) Ghi chú Dãy có thứ tự ngược Dãy được sắp Nhận xét • Bất kỳ giải thuật nào dựa vào sự hoán đổi các cặp thứ tự phải có độ phức tính toán trung bình là O(n2) • Insertion sort cũng ở trong dạng này Nhận xét • Bubble sort thì chậm hơn insertion sort • Một cải tiến được Knuth đưa ra gọi là Shaker sort... thứ tự • Độ phức tạp trong trường hợp xấu nhất và tốt nhất là dễ dàng để tính • Trường hợp trung bình cần phải xét các cặp chưa có thứ tự trong dãy nguồn ban đầu Tổng Kết • Sinh viên phải mô tả rõ giải thuật Bubble sort • Nắm rõ nguyên lý của Bubble sort có cờ và phương pháp cải tiến của Knuth (shaker sort) – Ghi nhận có sự đổi chỗ – Đánh dấu vị trí đổi chỗ sau cùng • Cài đặt trên mảng số nguyên • Phần . Nội dung • Giải thuật thứ hai có độ phức tạp O(n 2 ) là Bubble sort – Áp dụng chiến lược ngược với insertion sort • Ta sẽ khảo sát: – Giải thuật và ví dụ minh họa – Thời gian. đặt void BubbleSort( int array[] , int n ) { for (int i=n-1 ; i>0 ; i ) for ( int j=0 ; j<i ; j++ ) if ( array[j] > array[j+1] ) Swap ( array[j] , array[j+1] ) ; } Phân tích giải thuật • Vòng. bình thì không khác: dạng của giải thuật cần O(n 2 ) phép so sánh • Thông thường sau một số hữu hạn bước ta nhận thấy dãy đã có thứ tự. Phân tích giải thuật Trường hợp xấu nhất Bubble Sort