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

TỔNG QUAN VỀ CẤU TRÚC DỮ LIỆU VÀ THUẬT GIẢI pptx

35 521 0
Tài liệu đã được kiểm tra trùng lặp

Đ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

Tiêu đề Tổng quan về Cấu trúc dữ liệu và Thuật giải
Trường học Đại Học Bách Khoa Hà Nội
Chuyên ngành Cấu trúc dữ liệu và Thuật giải
Thể loại Bài giảng
Năm xuất bản 2024
Thành phố Hà Nội
Định dạng
Số trang 35
Dung lượng 1,74 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Selection Sort Sắp xếp chọn trực tiếpvà đưa lên đầu nhóm chúng ta còn lại N-1 phần tử đứng ở phía sau dãy M chưa có thứ tự..  Chúng ta tiếp tục chọn phần tử có giá trị nhỏ nhất trong

Trang 1

CHƯƠNG II : MỘT SỐ THUẬT TOÁN TÌM KIẾM VÀ SẮP XẾP

CHƯƠNG III : DANH SÁCH LIÊN KẾT - NGĂN XẾP VÀ HÀNG ĐỢI CHƯƠNG IV : CÂY

Trang 3

1 Nhập & Xuất mảng #define size 200

int a[size];

void main() {

int n, i;

//Nhap so phan tu cin >> n

Trang 4

}

Trang 5

a[i] = x;

}

}

Trang 6

0 1 2 3 4 5 6 7 8

2 Xóa 1 phần tử x trong mảng tại vị trí thứ k

n=6 n=5

Trang 9

1 Tuần tự

Giải thuật :

Bước 1 : Cho i = 0

Bước 2 : Nếu a[i] == x thì dừng chương trình, xuất kết quả tìm thấy

Bước 3 : Ngược lại tăng i lên một đơn vị

Bước 4 : Lặp lại bước 2 và 3 đến khi i >= n thì qua bước 5

Bước 5 : Kết luận không tìm thấy

Trang 10

ngược lại tăng i thêm 1

Lặp lại thực hiện đến khi i >= n

Trả về kết quả tìm không thấy

Hàm Sequence_Search

Cho i = 0

Thực hiện

Nếu a[i] == x thì dừng ct, trả về kết quả tìm thấy

ngược lại tăng i thêm 1 Lặp lại thực hiện đến khi i >= n

Trả về kết quả tìm không thấy

int Sequence_Search (int a[ ], int n, int x) {

int i = 0;

do {

if (a[i] == x)

return i;

else i++;

if (a[i] == x)

return i;

else i++;

Trang 11

= 5

a[m]

m=(Left + Right)/2 = (6+11)/2

= 8

a[m]

m=(Left + Right)/2 = (9+11)/2

Trang 12

= 5

a[m]

m=(Left + Right)/2 = (6+11)/2

= 8

a[m]

m=(Left + Right)/2 = (6+7)/2

Trang 13

= 5

a[m]

m=(Left + Right)/2 = (6+11)/2

= 8

a[m]

m=(Left + Right)/2 = (6+7)/2

= 7

a[m]

Trang 14

2 Nhị Phân

Ý Tưởng :

 Phạm vi tìm kiếm ban đầu của chúng ta là từ phần tử đầu tiên của dãy (Left = 1) cho đến phần tử cuối cùng của dãy (Right = N)

 So sánh giá trị X với giá trị phần tử đứng ở giữa của dãy M là M[Mid]

 Nếu X < M[Mid]: Rút ngắn phạm vi tìm kiếm về nửa đầu của dãy M (Right = Mid–1)

 Nếu X > M[Mid]: Rút ngắn phạm vi tìm kiếm về nửa sau của dãy M (Left = Mid+1)

 Lặp lại quá trình này cho đến khi tìm thấy phần tử có giá trị X hoặc phạm vi tìm kiếm của chúng ta không còn nữa (Left > Right)

Trang 15

2 Nhị Phân

Giải thuật :

Bước 1 : Cho L = 0; R = n-1

Bước 2 : m = (L + R) /2

Bước 3 : Nếu a[m] = x thì dừng ct, báo kết quả

Bước 4 : Nếu x > a[m] thì tăng L lên m + 1

Bước 5 : Ngược lại giảm R xuống m - 1

Bước 6 : Lặp lại bước 2,3,4,5,

cho đến khi L > R thì qua bước 7

Bước 7 : Kết luận không tìm thấy

Trang 16

2 Nhị Phân

Giải thuật:

Hàm Binary_Search

Cho Left = 0, Right = n-1

Thực hiện trong khi Left <= Right

m=(Left + Right)/2

Nếu a[m] == x thì

dừng ct, trả về kết quả tìm thấy (m)

ngược lại

nếu x > a[m] thì Left = m+1

ngược lại Right = m-1

Kết thúc tìm kiếm trong mảng tìm không

thấy Trả về kết quả tìm không thấy (-1)

Hàm Binary_Search

Cho Left = 0, Right = n-1

Thực hiện trong khi Left <= Right

m=(Left + Right)/2

Nếu a[m] == x thì

dừng ct, trả về kết quả tìm thấy (m)

ngược lại

nếu x > a[m] thì Left = m+1

ngược lại Right = m-1

Kết thúc tìm kiếm trong mảng tìm không

thấy Trả về kết quả tìm không thấy (-1)

int Binary_Search(int x, int a[ ], int n) {

int L = 0, R = n-1; int m;

while (L <= R) {

Trang 17

3 15 30 23 6 11 53 25 13 8 36 49

1 Selection Sort (Sắp xếp chọn trực tiếp)

Ý Tưởng :

Trang 20

1 Selection Sort ( Sắp xếp chọn trực tiếp)

và đưa lên đầu nhóm chúng ta còn lại N-1 phần

tử đứng ở phía sau dãy M chưa có thứ tự

 Chúng ta tiếp tục chọn phần tử có giá trị nhỏ

nhất trong N-1 phần tử chưa có thứ tự này để

đưa lên đầu nhóm chưa thứ tự này (N-1)

 Làm tiếp tục cho đến cuối dãy

Là phương pháp sắp xếp bằng cách chọn phần tử bé nhất xếp vào vị trí thứ nhất, tương tự với các phần tử nhỏ thứ hai, thứ ba,

Trang 21

if a[j] < a[min] thì min = j

đổi chỗ a[i] với a[min]

if a[j] < a[min] thì min = j

đổi chỗ a[i] với a[min]

void SelectionSort ( int a[ ], int n) {

} }

Cài đặt chương trình

Trang 22

2 Sắp xếp chèn trực tiếp (Straight Insertion Sort )

Ý Tưởng :

Trang 24

2 Sắp xếp chèn trực tiếp (Straight Insertion Sort)

Trang 25

2 Sắp xếp chèn trực tiếp (Straight Insertion Sort)

Ý Tưởng :

Trang 26

2 Sắp xếp chèn trực tiếp (Straight Insertion Sort)

Ý Tưởng :

Trang 27

2 Sắp xếp chèn trực tiếp (Straight Insertion Sort)

Ý Tưởng :

Trang 28

} }

void InsertionSort( int a[ ], int n) {

Cài đặt chương trình

Trang 29

3 Sắp xếp Nổi bọt (Bubble Sort)

Ý Tưởng :

sau) nhỏ hơn phần tử đứng ngay trên (trước) nó thì theo nguyên tắc của bọt khí

phần tử nhẹ sẽ bị “trồi” lên phía trên phần tử nặng (hai phần tử này sẽ được đổi chỗ cho nhau) Kết quả là phần tử nhỏ nhất (nhẹ nhất) sẽ được đưa lên (trồi lên) trên bề mặt (đầu mảng) rất nhanh

lần đi thì tất cả các phần tử trong mảng M sẽ có thứ tự tăng

Trang 30

3 17

5 13 16

19 23 25

i ++

j 3 5

3 13

3 16

n-1 0

Trang 31

5 17

13 16 3

19 23 25

i ++

j 5 13

5 16

n-1 0

Trang 32

i ++

j 5 17

13 16 3

19 23 25

5 13

5 16 16

n-1 0

Trang 33

void BubbleSort(int a[ ], int n) {

int i, j;

for (i = 0; i < n-1; i++) for (j = n-1; j > i; j ) {

if (a[j] < a[j-1]) swap(a[j] , a[j-1]); }

}

void BubbleSort( int a[ ], int n)

{ int i, j;

Trang 34

 Selection Sort

 Trung bình đòi hỏi n 2 /2 so sánh, n bước đổi chỗ

 Trường hợp xấu nhất tương tự

 Trung bình cần n 2 /4 so sánh, n 2 /8 bước đổi chỗ

 Xấu nhất cần gấp đôi các bước so với trường hợp trung bình

 Trung bình cần n 2 /2 phép so sánh, n 2 /2 thao tác đổi chỗ

 Xấu nhất cũng như vậy

Trang 35

5 Các phương pháp Sắp xếp khác

Ngày đăng: 02/08/2014, 18:21

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w