1. Tìm kiếm tuyến tính
Thuật toán tìm tuyến tính còn được gọi là Thuật toán tìm kiếm tuần tự (Sequential Search).
a. Ý tưởng
Lần lượt so sánh các phần tử của mảng M với giá trị X bắt đầu từ phần tử đầu tiên cho đến khi tìm đến được phần tử có giá trị X hoặc đã duyệt qua hết tất cả các phần tử của mảng M thì kết thúc.
b. Thuật toán:
B1: k = 1 //Duyệt từ đầu mảng
B2: IF M[k] # X AND k < N //Nếu chưa tìm thấy và cũng chưa duyệt hết mảng B2.1: k++
B2.2: Lặp lại B2 B3: IF k = N
Tìm thấy tại vị trí k
B4: ELSE
Không tìm thấy phần tử có giá trị X
B5: Kết thúc
c. Cài đặt thuật toán:
int timKiemTuyenTinh(int a[MAX],int n,int &x) {
cout<< “Nhap so tim:"); cin>> x;
if(a[i]==x) return i; return -1; }
2. Tìm kiếm nhị phân
- Sắp xếp dãy tìm kiếm thành một dãy tăng dần
- Nếu phần tử tìm kiếm X = M[mid]. Ngược lại so sánh từ vị trí < mid hoặc > mid để tiếp tục tìm kiếm.
a. Ý tưởng giải thuật
- 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 (First = 1) cho đến phần tử cuối cùng của dãy (Last = 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]: Tìm thấy
+ 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 (Last = 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 (First = 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 (First > Last).
b. Cài đặt thuật toán:
int BrinarySearch(int a[],int n,int &x) {
printf("\n\t Cho biet so can tim:"); scanf("%d",&x); int left=0,right=n-1; int mid; do{ mid=(left+right)/2; if(x==a[mid]) return mid; else { if(x<a[mid]) right=mid-1; else left=mid+1; } }while(left<=right);
return -1; }
c. Thuật toán đệ quy:
int RecBinarySearch (T M[], int First, int Last, T X) {
if (First > Last) return (-1);
int Mid = (First + Last)/2; if (X == M[Mid])
return (Mid); if (X < M[Mid])
return(RecBinarySearch(M, First, Mid – 1, X)); else
return(RecBinarySearch(M, Mid + 1, Last, X)); }
int BinarySearch (T M[], int N, T X) {
return (RecBinarySearch(M, 0, N – 1, X)); }
BÀI TẬP THỰC HÀNH
BÀI TẬP MẢNG VÀ CON TRỎ
Bài 1. Viết chương trình nhập vào một dãy n số thực a[0], a[1],..., a[n-1], sắp xếp dãy
số theo thứ tự từ lớn đến nhỏ. In dãy số sau khi sắp xếp.
Bài 2. Viết chương trình sắp xếp một mảng theo thứ tự tăng dần sau khi đã loại bỏ các
phần tử trùng nhau.
Bài 3. Viết chương trình nhập vào một mảng, hãy xuất ra màn hình:
- Phần tử lớn nhất của mảng. - Phần tử nhỏ nhất của mảng.
- Tính tổng của các phần tử trong mảng.
Bài 4. Viết chương trình nhập vào một dãy các số theo thứ tự tăng, nếu nhập sai quy
cách thì yêu cầu nhập lại. In dãy số sau khi đã nhập xong. Nhập thêm một số mới và chèn số đó vào dãy đã có sao cho dãy vẫn đảm bảo thứ tự tăng. In lại dãy số để kiểm tra.
Bài 5. Viết chương trình nhập vào một mảng số tự nhiên. Hãy xuất ra màn hình:
- Dòng 1 : gồm các số lẻ, tổng cộng có bao nhiêu số lẻ. - Dòng 2 : gồm các số chẵn, tổng cộng có bao nhiêu số chẵn. - Dòng 3 : gồm các số nguyên tố.
- Dòng 4 : gồm các số không phải là số nguyên tố.
Bài 6. Viết chương trình tính tổng bình phương của các số âm trong một mảng các số
nguyên.
Bài 7. Viết chương trình thực hiện việc đảo một mảng một chiều.
Ví dụ : 1 2 3 4 5 7 9 10 đảo thành 10 9 7 5 4 3 2 1.
Bài 8. Giả sử có danh sách liên kết mà mỗi nốt của nó lưu một giá trị nguyên. Viết
chương trình sắp xếp danh sách theo thứ tự giảm dần.
Bài 9. Giả sử có danh sách liên kết mà mỗi nốt của nó lưu một giá trị nguyên được sắp
giảm dần. Viết chương trình cho phép chèn thêm một phần tử vào danh sách sao cho danh sách vẫn được sắp giảm dần.
BÀI TẬP DANH SÁCH
Bài 1. Trình bày thuật toán và cài đặt tất cả các thao tác trên danh sách liên kết đôi
trong trường hợp chỉ quản lý bằng con trỏ đầu trong danh sách?
Bài 2. Trình bày thuật toán và cài đặt tất cả các thao tác trên hàng đợi, ngăn xếp biểu
diễn bởi danh sách liên kết đôi trong hai trường hợp: Danh sách liên kết cùng chiều và ngược chiều với hàng đợi, ngăn xếp?
Bài 3. Vận dụng các thuật toán sắp xếp đã học, hãy cài đặt các hàm sắp xếp trên danh
sách liên kết đơn, liên kết đôi theo hai cách quản lý: - Quản lý địa chỉ nút đầu danh sách;
- Quản lý địa chỉ nút đầu và cuối danh sách.
Theo bạn thuật toán sắp xếp nào dễ vận dụng hơn trên danh sách liên kết đơn, liên kết đôi trong hai trường hợp này?
Bài 4. Viết chương trình minh hoạ việc sử dụng danh sách liên kết đơn với các chức năng:
a. Khởi tạo danh sách b. Thêm phần tử c. Xoá phần tử d. In danh sách
Bài 5: Cho một DSLK đơn. Mỗi phần tử gồm info là một số nguyên và liên kết chỉ đến
phần tử kế.
a. Tạo 2 DSLK đơn mới (không phá huỷ DSLK đã cho).
Một danh sách chứa các số lẻ của danh sách đã cho.
Một danh sách chứa các số chẵn của danh sách đã cho.
b. Viết chương trình in ra DSLK đã cho theo thứ tự ngược. (HD: Sử dụng đưa DSLK vào Stack).
c. In ra các danh sách tách tự nhiên từ DSLK đã cho: VÍ DỤ: DSLK ban đầu biểu diễn các số: 1 5 6 4 8 3 7 In ra các dãy số: 1 5 6 4 8 3 7
d. Sắp xếp tăng/giảm dần danh sách đã cho theo các phương pháp: chọn trực tiếp, nổi bọt, đổi chỗ trực tiếp.
BÀI TẬP NGĂN XẾP VÀ HÀNG ĐỢI
Bài 1. Để cài đặt ngăn xếp bằng mảng 1 chiều, ta cần bố trí ngăn xếp trong mảng như
thế nào?
Cần dùng thêm các biến phụ nào?
Bài 2. Hạn chế của cài đặt ngăn xếp bằng mảng so với danh sách liên kết là gì? Bài 3. Để cài đặt ngăn xếp bằng danh sách liên kết cần bố trí danh sách như thế nào? Bài 4. Hoàn thiện mã nguồn của chương trình tính biểu thưc dạng hậu tố.
Bài 5. Hoàn thiện mã nguồn chương trình chuyển đổi biểu thức dạng trung tố sang hậu
tố.
Bài 6. Viết chương trình đổi 1 số nguyên từ hệ thập phân sang nhị phân sử dụng ngăn
Bài 7. Sự khác biệt cơ bản giữa hàng đợi và ngăn xếp là gì?
Bài 8. Hoàn thiện mã nguồn của chương trình cài đặt ngăn xếp bằng mảng và danh sách liên kết bao gồm khai báo và các thao tác như hướng dẫn trong tài liệu.
Bài 9. Hoàn thiện mã nguồn của chương trình cài đặt hàng đợi bằng mảng và danh sách
liên kết bao gồm khai báo và các thao tác như hướng dẫn trong tài liệu.
BÀI TẬP SẮP XẾP VÀ TÌM KIẾM
Bài 1. Cài đặt các thuật toán sắp xếp trên mảng 1 chiều.
Bài 2. Áp dụng các thuật toán sắp xếp để cài đặt trên danh sách, ngăn xếp và hàng đợi. Bài 3. Cài đặt các thuật toán tìm kiếm trên mảng 1 chiều.
Bài 4. Áp dụng các thuật toán tìm kiếm để cài đặt trên danh sách, ngăn xếp và hàng đợi.