Tập các phần tử thuộc cùng một kiểu dữ liệu Được sắp xếp liên tục trong bộ nhớ kích thước là cố định Có thể đánh chỉ số và truy cập theo thứ tự ngẫu nhiên C/C++: chỉ số luôn bắ
Trang 1Mảng và xâu ký tự
Trang 3Tài liệu tham khảo
C++ How to program, Chapter 7
The C programming language, Chap 1.6, 1.9, Chap 5
Trang 4 Tập các phần tử thuộc cùng một kiểu dữ liệu
Được sắp xếp liên tục trong bộ nhớ
kích thước là cố định
Có thể đánh chỉ số và truy cập theo thứ tự ngẫu nhiên
C/C++: chỉ số luôn bắt đầu từ 0
Trang 8Kích thước mảng không cần biết trước
Trang 9Mảng là tham số
Có thể truyền mảng là tham số cho một
hàm
Như là tham số biến
Hàm cần phải biết kích thước của mảng
thông qua một tham số phụ
thông qua giá trị kết thúc mảng
Trang 11int linearSearch(int, int [], int);
Trang 12Bài tập
Viết các hàm tính giá trị lớn nhất, giá trị
nhỏ nhất, giá trị trung bình của một mảng
số nguyên
Trang 14Sắp xếp và tìm kiếm
Một trong các công việc chính của các HTTT
Sắp xếp để tìm kiếm hiệu quả, vd từ điển
Sắp xếp
đổi chỗ các phần tử tạo ra một mảng có thứ tự
sắp xếp chọn, chèn, nổi bọt, nhanh, trộn,…
Tìm kiếm
tìm kiếm nhị phân (binary search)
sử dụng thuật toán băm (hashing)
Trang 15Sắp xếp chọn (selection sort)
Tìm (chọn) phần tử nhỏ nhất, đổi lên vị trí đầu tiên
Trong số phần tử còn lại, tìm phần tử nhỏ nhất, đổi lên vị trí thứ 2
Lặp lại cho đến hết
Trang 18Sắp xếp chèn (insertion sort)
Giả sử dãy k phần tử đầu đã sắp xếp
dãy 1 phần tử đầu tiên hiển nhiên là đã có thứ
tự
Xét phần tử tiếp theo, tìm cách chèn nó
vào vị trí thích hợp (dịch chuyển các phần
tử lớn hơn lùi lại một vị trí)
Như vậy k+1 phần tử đã có thứ tự, xét tiếp
Trang 20Sắp xếp nổi bọt (bubble sort)
Tuần tự xét các phần tử từ 2 đến n, đối vớiphần tử thứ k:
So sánh nó với phần tử trước đó, nếu nó nhỏ hơn thì đổi chỗ, cứ như vậy đến khi phần tử này không đổi chỗ được nữa
(không nổi lên được nữa)
Trang 22Độ phức tạp của các thuật toán sắp
Trang 23Bài tập
Hãy tính số phép toán so sánh và đổi cho của các thuật toán sắp xếp chọn, sắp xếp chèn, nổi bọt trong các trường hợp
mảng ngẫu nhiên
mảng đã đúng thứ tự
mảng ngược thứ tự hoàn toàn
Trang 24Tìm kiếm nhị phân (binary search)
So sánh khóa với phần tử giữa mảng, nếu không trùng thì ta xác định được khóa sẽ nằm ở nửa đầu hay nửa cuối mảng, lặp lại tìm kiếm cho phần nửa mảng này
Dừng lại khi tìm thấy hoặc khi mảng chỉ
còn 1 phần tử mà không trùng
Thường cài đặt không sử dụng đệ qui.
Độ phức tạp O(log n)
Trang 27Khai báo, nhập/xuất xâu
Trang 28Tham số là xâu ký tự
Về cơ bản như mảng
Như là tham số biến
Có phần tử kết thúc xâu nên thường
không cần truyền kích thước
Trang 29void stringCopy(char s1[], char s2[])
Trang 30Bài tập
Viết hàm tính kích thước của một xâu ký tự
Viết hàm so sánh hai xâu ký tự có bằng
nhau hay không
Trang 32bool stringCompare(char s1[], char s2[])
{
int i = 0;
while (s1[i] == s2[i] && s[i] > 0) i++;
if (s1[i] == s2[i]) return true;
else return false;
}
Trang 33Một số hàm thư viện xâu
Sử dụng thư viện string (thư viện C)
#include <string.h>
Một số hàm
strlen(s) : trả lại kích thước xâu s
strcpy(s1, s2) : copy s2 vào s1
strcmp(s1, s2) : so sánh, nếu bằng thì kết quả
là 0;
Trang 35Bài tập
Viết hàm tạo xâu nghịch đảo: nhận tham
số là xâu, tạo xâu nghịch đảo của chính
xâu đó và ghi kết quả vào chính xâu tham
số vào
Viết hàm kiểm tra một xâu ký tự có nằm trong một xâu ký tự khác hay không
Trang 36Tự thực hành
Thao tác thành thạo với mảng một chiều
Cài đặt các hàm sắp xếp chọn, chèn, nổi bọt và tìm kiếm nhị phân
Thao tác với xâu ký tự
nhập xuất, tạo hằng xâu
sử dụng các hàm thư viện copy, so sánh,…