Tải bản đầy đủ (.pdf) (7 trang)

Dap an tham khao de thi giua ky CTDL HK2 2015 2016

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (250.48 KB, 7 trang )

ĐẠI HỌC QUỐC GIA TP.HCM

CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM

TRƯỜNG ĐẠI HỌC CNTT

Độc lập -Tự do - Hạnh phúc

ĐỀ THI GIỮA KỲ
MÔN CẤU TRÚC DỮ LIỆU & GIẢI THUẬT
THỜI GIAN: 60 PHÚT
Sinh viên không tham khảo tài liệu

Câu 1:
a. Trình bày ý tưởng thuật toán tìm kiếm nhị phân (2 đ).
Sinh viên trình bày được ý tưởng của thuật toán :
-

Thuật toán chỉ thực hiện đúng khi dãy / mảng đã có thứ tự

-

Khác với thuật toán tìm kiếm tuyến tính, thuật toán tìm kiếm nhị phân không
so sánh phần tử cần tìm kiếm với tất cả phần tử trong dãy /mảng, mà so sánh
với phần tử ở giữa dãy / mảng để quyết định phần tử sẽ so sánh trong bước tiếp
theo nằm ở nửa bên trái hay bên phải của phần tử đang xét trong dãy/mảng tìm
kiếm cho đến khi tìm thấy hoặc kết thúc thuật toán.

b. Mô tả từng bước kết quả chạy thuật toán tìm giá trị x=10 trong mảng A={1,
2, 3, 4, 6, 7, 8, 9} bằng phương pháp tìm kiếm nhị phân (2 đ)
Số phần tử N= 8, phần tử cần tìm X= 10


1

Lần 1

2

3

4

6

7

8

9


0.25 đ
Left = 0, Right = N - 1 = 7
Mid = (Left + Right) / 2 = (0 + 7) / 2 = 3
0.25 đ
A[Mid] = A[3] = 4 < X =10 : cập nhật Left = Mid +1 = 3 +1 = 4
Do Left <= Right : thuật toán tiếp tục

Lần 2
0.25 đ
Left = 4, Right = N - 1 = 7
Mid = (Left + Right) / 2 = (4 + 7) / 2 = 5

0.25 đ
A[Mid] = A[5] = 7 < X =10 : cập nhật Left = Mid +1 = 5 +1 = 6
Do Left <= Right : thuật toán tiếp tục

Lần 3
0.25 đ
Left = 6, Right = N - 1 = 7
Mid = (Left + Right) / 2 = (6 + 7) / 2 = 6
0.25 đ
A[Mid] = A[6] = 8 < X =10 : cập nhật Left = Mid +1 = 6 +1 = 7
Do Left <= Right : thuật toán tiếp tục


Lần 4
0.25 đ
Left = 7, Right = N - 1 = 7
Mid = (Left + Right) / 2 = (7 + 7) / 2 = 7
0.25 đ
A[Mid] = A[7] = 9 < X =10 : cập nhật Left = Mid +1 = 7 +1 = 8
Do Left > Right : thuật toán kết thúc.
Kết luận : không có X = 10 trong dãy.

Câu 2:
a. Trình bày ý tưởng thuật toán sắp xếp Quick Sort (2 đ).
Thuật toán QuickSort sắp xếp dãy a , a ..., a dựa trên việc phân hoạch dãy ban đầu
1

2

N


thành 3 đoạn / phần :
Đoạn 1: Gồm các phần tử có giá trị bé hơn x
Đoạn 2: Gồm các phần tử có giá trị bằng x
Đoạn 3: Gồm các phần tử có giá trị lớn hơn x
với x là giá trị của một phần tử tùy ý trong dãy ban đầu.
Sau khi thực hiện phân hoạch, dãy ban đầu được phân thành 3 đoạn:

Xét từng đoạn :
-

Xét đoạn thứ 2 : đã có thứ tự, không cần sắp xếp

-

Xét đoạn 1 và 3 :
+ Nếu các đoạn 1 và 3 chỉ có 1 phần tử : đã có thứ tự, không cần
sắp xếp

khi đó dãy ban đầu đã được sắp xếp


+ Nếu các đoạn 1 và 3 có nhiều hơn 1 phần tử thì dãy ban đầu chỉ
có thứ tự khi các đoạn 1, 3 được sắp. Để sắp xếp các đoạn 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
phân hoạch dãy ban đầu vừa trình bày
b. Mô tả từng bước kết quả chạy thuật toán với mảng các số nguyên cho dưới
đây để sắp xếp mảng giảm dần: (2 đ)
22
12

9
7
31
19
27
0.5 đ
Số phần tử N= 7
22
12

9

7

31

19

27

Giả sử chọn phần tử phân hoạch : phần tử đầu dãy X= 22
Ta được :
Đoạn 1 : 12, 9, 7, 19
Đoạn 2 : 22
Đoạn 3 : 31, 27
12

9

7


19

22

31

0.5 đ
Phân đoạn : đoạn 1 của dãy đã cho : 12, 9, 7, 19
12

9

7

19

Giả sử chọn phần tử phân hoạch : phần tử đầu dãy X= 12
Ta được :
Đoạn 1.1 : 9, 7
Đoạn 1.2 : 12
Đoạn 1.3 : 19

27


9

7


12

19

0.5 đ
Phân đoạn đoạn 1.1 tiếp theo
Giả sử chọn phần tử phân hoạch : phần tử đầu dãy X= 9
9
7
Ta được :
Đoạn 1.1.1 : 7
Đoạn 1.1.2 : 9
Đoạn 1.1.3 : không có phần tử
7
9
Vậy đoạn 1 đã sắp xếp :
7

9

12

19

0.5 đ
Phân đoạn : đoạn 3 của dãy đã cho: 31, 27
31
27
Giả sử chọn phần tử phân hoạch : phần tử đầu dãy X= 31
Ta được :

Đoạn 3.1 : 27
Đoạn 3.2 : 31
Đoạn 3.3 : không có phần tử
27
31
Vậy đoạn 3 đã sắp xếp :
27
31


Vậy dãy cho đã cho sắp xếp :
7

9

12

19

22

27

Câu 3 :
Viết hàm cài đặt thuật toán sắp xếp chọn trực tiếp (selection sort) (2 đ)
Viết được hàm sắp xếp : 1.5 đ
0.5 đ
void SelectionSort(int a[],int N )
{
int

min;
int
i,j;
for (i=0; i< N-1 ; i++)
{
0.75 đ
min = i;
for(j = i+1; j if (a[j ] < a[min])
min = j;
0.25 đ

}

Swap(a[min],a[i]); // Hàm hoán vị hai giá trị
}

Viết được hàm hoán vị Swap : 0,5 đ
0.25 đ
void Swap(int a, int b )
{
int temp ;
0.25 đ

31


temp = a ;
a=b;
b = temp ;

}

Hết



×