SẮP XẾP VÀ TÌM KIẾM
TRÊN CTDL MẢNG
Nhóm 2:
Nguyễn Khắc Duy
Nguyễn Thị Lan Ngọc
Võ Hoàng Yến
GIỚI THIỆU
CTDL mảng là một trong số những CTDL thông dụng
nhất.
Mảng là một tập hợp có thứ tự các giá trị có cùng cấu trúc
được lưu trữ liên tiếp nhau trong bộ nhớ.(Mảng là một
danh sách tuyến tính).
CÁC THUẬT TOÁN
TÌM KIẾM VÀ SẮP XẾP
TÌM KIẾM
Trong hầu hết các hệ lưu trữ, quản lí dữ liệu, thao tác
tìm kiếm thường được thực hiện nhất để khai thác thông
tin.
VD: tra cứu từ điển, tìm sách thư viện
Việc xây dựng các giải thuật cho phép tìm kiếm nhanh
sẽ có ý nghĩa rất lớn
HAI GIẢI THUẬT THƯỜNG DÙNG ĐỂ
TÌM KIẾM DỮ LIỆU
Tìm kiếm tuần tự
Tìm kiếm nhị phân
TÌM KIẾM TUẦN TỰ
Một kĩ thuật tìm kiếm đơn giản và cổ điển.
Ý tưởng: So sánh x lần lượt với từng phần tử của mảng
cho đến khi gặp phần tử có khóa cần tìm, hoặc đã tìm
hết mảng mà không thấy x.
12 2 8 5 1
X=8
12 2 8 5 1
X=8
12 2 8 5 1
X=8
i=0
i=1
i=2
Tìm thấy rồi
i=2
Tìm thấy rồi
i=0 i=1
12 2 8 5 1
X=8
Vị trí của x cần tìm là:2
12 2 8 5
X=7
i=0
12 2 8 5
X=7
i=1
12 2 8 5
X=7
i=2
12 2 8 5
X=7
i=3
KHÔNG TÌM
THẤY !
i=2
KHÔNG
TÌM
THẤY !!!!!
X=7
i=0 i=1
12 2 8 5 1
i=3
i=4
NHẬN XÉT
Giải thuật tìm kiếm tuần tự không phụ thuộc thứ tự
các phần tử mảng là cách tổng quát nhất để tìm
kiếm trên một dãy số bất kỳ.
Độ phức tạp: T(n)=O(n)
TÌM KIẾM NHỊ PHÂN
Tìm kiếm trong dãy số đã có thứ tự.
Ý tưởng: Tại mỗi bước tiến hành so sánh x với phần tử
giữa của mảng giới hạn mảng tìm kiếm ở nửa trước
hay nửa sau mảng thu hẹp vùng tìm kiếm (nhị phân).
X=8
1 2 4 5 6 8 12 15
L=0 R=7M=3
L=4 M=5
TÌM THẤY
RỒI !
Phần tử cần tìm là 8:
Quá trình tìm:
L=0,R=7M=3
L=4,R=7M=5
NHẬN XÉT
Giải thuật tìm kiếm nhị phân chỉ áp dụng cho những mảng
đã được sắp xếp.
Tiết kiệm thời gian rất nhiều so với tìm kiếm tuần tự.
Độ phức tạp: T(n)=O(log
2
n).
SẮP XẾP
Sắp xếp là quá trình xử lí một danh sách để chúng theo
một thứ tự thỏa mãn một tiêu chuẩn nào đó.
Sắp xếp dữ liệu là một nhu cầu thường thấy và cần
thiết. Chẳng hạn, trước khi tìm kiếm nhị phân, mảng
cần được sắp xếp.
CÁC GIẢI THUẬT SẮP XẾP
THƯỜNG THẤY
ExchangeSort (Chọn trực tiếp).
InsertSort (Chèn trực tiếp).
BubbleSort (Nổi bọt).
HeapSort
ShellSort
QuickSort
EXCHANGESORT
(Chọn trực tiếp)
Mô phỏng cách sắp xếp tự nhiên nhất trong thực tế.
Ý tưởng: thực hiện n-1 lần việc đưa phần tử nhỏ nhất về vị
trí đúng ở đầu mảng.
i=0
12 2 8 5 1
i=1 i=2 i=3
XONG RỒI !
i=4
Nhận xét
Độ phức tạp : T(n)=O(n
2
).
Số phép so sánh không phụ thuộc tình trạng
mảng ban đầu.
Số lần hoán vị phụ thuộc tình trạng mảng ban
đầu.
Trường hợp Số lần so
sánh
Số phép gán
Tốt nhất n(n-1)/2 0
Xấu nhất n(n-1)/2 3n(n-1)/2
INSERTSORT
(Chèn trực tiếp)
Ý tưởng: lần lượt chèn phần tử a[i] vào vị trí thích hợp
của đọan đã được sắp để được dãy mới a[1],a[2],…,a[i]
có thứ tự.
12 2 8 5 1
i=1 i=2 i=3 i=4
HOÀN TẤT !
Nhận xét
Độ phức tạp: T(n)=O(n
2
).
Số phép so sánh và dời chỗ phụ thuộc vào tình
trạng ban đầu của mảng.
Trường hợp Số phép so
sánh
Số phép
gán
Tốt nhất n-1 2(n-1)
Xấu nhất n(n-1)/2 n(n+1)/2-1
BUBBLESORT
(Nổi bọt)
Ý tưởng: xuất phát từ cuối mảng đổi chỗ các cặp phần tử
kế cận để đưa phần tử nhỏ hơn về vị trí đúng đầu mảng
hiện hành. Sau đó không xét đến nó nữa.
12 2 8 5 1
i=0 j=4j-1i=1 i=3
i=2
XONG RỒI !
Nhận xét
Độ phức tạp: T(n)=O(n
2
)
BubbleSort có khuyết điểm: không nhận diện
được dãy đã có thứ tự hoặc thứ tự từng phần;
các phần tử lớn được đưa về vị trí rất chậm.
Trường hợp Số phép so sánh Số phép gán
Tốt nhất n(n-1)/2 0
Xấu nhất n(n-1)/2 n(n-1)/2