1. Trang chủ
  2. » Công Nghệ Thông Tin

Thuật toán BubbleSort doc

33 309 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

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

Ngày đăng: 01/04/2014, 20:23

TỪ KHÓA LIÊN QUAN