ĐẠI HỌC QUỐC GIA TP.HCM TRƯỜNG ĐẠI HỌC CNTT CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độ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
Trang 1ĐẠI HỌC QUỐC GIA TP.HCM
TRƯỜNG ĐẠI HỌC CNTT
CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM
Độ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
Lần 1
Trang 2Left = 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
Trang 3Lầ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
1 , a
2 ., a
N dựa trên việc phân hoạch dãy ban đầu 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
Trang 4có 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
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
0.5 đ
Phân đoạn : đoạn 1 của dãy đã cho : 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
Trang 59 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
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ử
Vậy đoạn 1 đã sắp xếp :
0.5 đ
Phân đoạn : đoạn 3 của dãy đã cho: 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ử
Vậy đoạn 3 đã sắp xếp :
Trang 67 9 12 19 22 27 31
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;
if (a[j ] < a[min])
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 đ
Trang 7temp = a ;
a = b ;
b = temp ;
}
Hết