1. TRƯỜNG ĐẠI HỌC DÂN LẬP KỸ THUẬT CÔNG NGHỆ ------ ------ GV: ThS. NGUYỄN HÀ GIANG CẤU TRÚC DỮ LIỆU TP. HCM – 1/2008 TÌM KIẾM & SẮP XẾP CHƯƠNG 2
2.
3.
4.
5.
6.
7.
8.
9. 2.1.1 Tìm kiếm tuyến tính (7) int Search(int a[], int n, int key ) { int i =0; a[n] =key ; // thêm phần tử thứ n+1 while ( key != a[i] ) i++; if ( i == n ) return -1; // tìm hết mảng nhưng không có x else return i ; // tìm thấy x tại vị trí i } Thuật toán tìm kiếm tuyến tính cải tiến
56. 2.2.7 PP RadixSort 493 812 715 710 195 437 582 340 385 Phân lô hàng đv 710 340 812 582 493 715 195 385 437 Sau khi phân lô theo hàng đơn vị Số hàng đv Dãy con 0 710 340 1 2 812 582 3 493 4 5 715 195 385 6 7 437 8 9
57. 2.2.7 PP RadixSort 7 1 0 3 4 0 8 1 2 5 8 2 4 9 3 7 1 5 1 9 5 3 8 5 4 3 7 710 812 715 437 340 582 385 493 195 Phân lô hàng chục Sau khi phân lô theo hàng ch ục Số hàng chục Dãy con 0 1 710 812 715 2 3 437 4 340 5 6 7 8 582 385 9 493 195
58. 2.2.7 PP RadixSort 710 812 715 437 340 582 385 493 195 195 340 385 437 493 582 710 715 812 Phân lô hàng trăm Sau khi phân lô theo hàng tr ăm Số hàng trăm Dãy con 0 1 195 2 3 340 385 4 437 493 5 582 6 7 710 715 8 812 9
59.
60.
61.
62.
Hinweis der Redaktion
Do các hệ thống thông tin lưu trữ một khối lượng dữ liệu lớn, nên thuật toán tìm kiếm tốt sẽ có ý nghĩa rất lớn . Nếu dữ liệu trong hệ thống được tổ chức theo một trật tự nào đó thì việc tìm kiếm sẽ tiến hành nhanh chóng và hiệu quả hơn . VD: sách được xếp theo chủ đề, danh sách người được sắp theo alphabet…
Không phải toàn bộ các trường đều tham gia quá trình sắp xếp mà chỉ có một trường nào đó (hoặc một vài trường) được quan tâm
Nhận xét: 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ỏ đưa về vị trí đúng rất nhanh, trong khi các phần tử lớn lại đưa về vị trí đúng rất chậm.
Những dãy này được coi là những dãy con xếp theo độ dài bước h. Tư tưởng chính của thuật toán ShellSort là: với mỗi bước h, áp dụng thuật toán sắp xếp kiểu chèn từng dãy con độc lập để làm mịn dần các phần tử trong dãy chính. Tiếp tục làm tương tự đối với bước h div 2... cho đến khi h = 1 thì ta được dãy phần tử được sắp. Xét trong ví dụ trên, nếu chúng ta dùng phương pháp chèn thì với phần tử a[5] = 2 là phần tử nhỏ nhất trong dãy, do đó nó phải chèn vào vị trí thứ 1, tức là phải chèn trước 4 phần tử trước nó. Nhưng nếu chúng ta xem 2 là phần tử của dãy 2 thì ta chỉ cần chèn trước một phần tử là 3. Đây chính là nguyên nhân thuật toán ShellSort thực hiện hiệu quả hơn sắp xếp chèn. Khi đó khóa nhỏ nhanh chóng đưa về gần vị trí đúng của nó.
Ta có nhận xét khi đó dãy con thứ 2 đã có thứ tự, nếu dãy con 1 và dãy con 3 có một phần tử thì chúng cũng đã có thứ tự, khi đó dãy ban đầu đã được sắp. Ngược lại, nếu dãy con 1 và 3 có nhiều hơn một phần tử thì dãy ban đầu có thứ tự khi dãy con 1 và 3 được sắp. Để sắp xếp dãy con 1 và 3, ta lần lượt tiến hành việc phân hoạch từng dãy con theo cùng phương pháp vừa trình bày.
Lưu ý những phần tử này được đưa vào dãy con theo thứ tự tìm thấy, do đó chúng ta có thể thấy là các dãy con chưa có thứ tự