Professional Documents
Culture Documents
mảng
mảng
C4. MẢNG
Trần Thanh San – Khoa CNTT 1
C3. Tổng quan về Mảng
• Kích thước được xác định ngay khi khai báo và không thay đổi.
• NNLT C luôn chỉ định một khối nhớ liên tục cho một biến kiểu mảng.
0 1 2 3 4 5 6 7 8 9
Mang1Chieu
int Mang2Chieu[3][4];
0 1 2 3 4 5 6 7 8 9 10 11
Mang2Chieu 0
1
2
2.2 Ví dụ:
int a[10];
• Ví dụ int a[4];
• Cho mảng như sau 0 1 2 3
• Ví dụ #define MAX 3
typedef int MangSo[MAX];
MangSo a = {1, 2, 3}, b;
b = a; // Sai
for (int i = 0; i < 3; i++) b[i] = a[i];
0 1 2 3 4 5 6 7 8 9
Vấn đề ??????
- Số phần tử tăng thêm 1
- Dời các vị trí từ 0 -> 1, 1 ->2 , … n -> n+1
- Thêm phần tử vào đầu
12
3. Các thao tác cơ bản (tt)
Thêm phần tử vào mảng (tt):
0 1 2 3 4 5 6 7 8 9
Vấn đề ??????
Vấn đề ??????
15
3. Các thao tác cơ bản (tt)
• Xóa một phần tử của mảng:
Vấn đề ??????
16
3. Các thao tác cơ bản (tt)
• Xóa phần tử của mảng:
0 1 2 3 4 5 6 7 8 9
Vấn đề ??????
17
TTTK
TOÁN
18
ĐẶT VẤN ĐỀ
Trong công việc hàng ngày cũng như các bài toán
quản lý kinh tế cần tìm kiếm dữ liệu. Việc tìm kiếm một
mẩu tin thỏa mãn một yêu cầu nào đó đòi hỏi phải có
các thuật toán giúp cho việc tìm kiếm trở nên:
❖ Dễ dàng
❖ Nhanh chóng
19
PHÁT BIỂU BÀI TOÁN TÌM KIẾM
20
CÁC PHƯƠNG PHÁP TÌM KIẾM
21
Tìm kiếm nhị phân (BinarySearch)
a. Ý tưởng
➢ Nếu không, tùy theo giá trị của x ta thu hẹp KGTK
và lặp lại bước trên cho đến khi tìm thấy (hoặc kết
luận không có phần tử cần tìm trong mảng).
22
Tìm kiếm nhị phân (tt)
b. Thuật toán
23
Tìm kiếm nhị phân (tt)
c. Cài đặt
int BinarySearch (int a[], int n, int x)
{
int left=0;
int right=n-1;
int mid;
do
{
mid=(left+right)/2;
if(a[mid]==x)
return mid;
if(a[mid]>x)
right=mid-1;
else
left=mid+1;
}while(left<=right);
return (-1);
}
24
Tìm kiếm tuyến tính (LinearSearch)
b. Thuật toán
B2: So sánh x với a[i], nếu x = a[i] thì sang B3, ngược lại sang B4.
B5: Kiểm tra i, nếu i>=n thì sang B6, nếu không thì quay lại B4.
25
Tìm kiếm tuyến tính (tt)
c. Cài đặt
0 1 2 3 4 5 6 7 8 9
Vấn đề ??????
27
3. Các thao tác cơ bản (tt)
Sắp xếp mảng tăng dần/ giảm dần:
0 1 2 3 4 5 6 7 8 9
Vấn đề ??????
28
Thuật toán nổi bọt (BubbleSort)
a. Ý tưởng:
❖ Xét từ cuối dãy ngược về vị trí i
❖ Nếu hai phần tử kế cận ngược thứ tự thì đổi chỗ cho
nhau
29
Thuật toán nổi bọt (BubbleSort)
a. Ý tưởng:
❖ Xét từ cuối dãy ngược về vị trí i
❖ Nếu hai phần tử kế cận ngược thứ tự thì đổi chỗ cho
nhau
30
Thuật toán nổi bọt (tt)
b. Thuật toán:
➢ Bước 1: i=0;
➢ Bước 2: j=n;
• Trong khi j>i thực hiện:
▪ Nếu Aj < Aj-1 : đổi chỗ Aj và Aj-1
▪ j= j-1
➢ Bước 3: i = i +1
• Nếu i>n-1: Hết dãy -> Dừng
• Ngược lại: lặp lại bước 2.
31
Thuật toán nổi bọt (tt)
c. Ví dụ:
i=0 j=3
7
4
5
2
32
Thuật toán nổi bọt (tt)
i=1 5
j=3
6
33
Thuật toán nổi bọt (tt)
i=2 j=6
4
34
Thuật toán nổi bọt (tt)
i=3 j=5
7
35
Thuật toán nổi bọt (tt)
i=4 j=6
36
Thuật toán nổi bọt (tt)
i=5 j=7
37
Cài đặt
void BubleSort (int a[],int n)
{
for(int i=0;i<n;i++)
for(int j=n-1;j>i;j--)
{
if(a[j-1]>a[j])
{
int temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
}
}
38
C3. Tổng quan về Mảng
• Cú pháp
N1, N2: số lượng phần tử mỗi chiều (dòng/ cột)
0
Kiểu MaTran 1
2
Trần Thanh San – Khoa CNTT 40
3. Mảng hai chiều (tt)
3.1. Truy xuất đến một phần tử
• Thông qua chỉ số <tên biến mảng>[<giá trị cs1>][<giá trị cs2>]
• Ví dụ int a[3][4];
0 1 2 3
• Cho mảng 2 chiều như sau
0
1
• Các truy xuất 2
b = a; // Sai
int i, j;
for (i = 0; i < 3; i++)
for (j = 0; j < 4; j++)
b[i][j] = a[i][j];
Trần Thanh San – Khoa CNTT 42
KẾT THÚC
CHƯƠNG 3