Các thao tác trên mảng một chiều

Một phần của tài liệu Bài giảng Tin học đại cương (Trang 52)

Các thao tác thường gặp trên mảng là tìm vị trí của phần tử lớn nhất (nhỏ nhất), tìm vị trí xuất hiện của phần tử trong mảng, sắp xếp mảng (tăng dần hoặc giảm dần).

Trong mục này, chúng ta sẽ phân tích và cài đặt chúng thành các hàm. Không mất tổng quát ta sẽ thao tác trên mảng số nguyên (mang_nguyen).

4.1.2.1 Tìm phần tử lớn nhất trong mảng

Đầu vào: Mảng a0, a1, .., aN-1.

Đầu ra: LonNhat = max {a0, a1, .., aN-1}.

Hình 4.2: Thuật toán tìm phần tử lớn nhất trong một mảng.

Giá trị  là giá trị vô hạn không thể biểu diễn trong máy tính (hữu hạn). Ta định nghĩa hằng VoCung mang giá trị bé nhất mà máy tính (NNLT) hiểu được, chẳng hạn: là -2,147,483,648 nếu a1, a2, .., aN là các số nguyên được lưu trữ bởi kiểu số nguyên lớn có dấu; là -1.7*10-308

nếu a1, a2, .., aN là các số thực được lưu trữ bởi kiểu số thực lớn. Để phạm vi sử dụng lớn hơn, ta sẽ tìm vị trí của phần tử lớn nhất trong mảng con {a[dau], .., a[cuoi]} của mảng a. Cài đặt như sau:

mang_nguyen a; int vt_ln = dau; for (int j=dau+1; j<=cuoi; j++)

if (a[j] > a[vt_ln]) vt_ln = j;

Bài tập: Viết chương trình tìm vị trí của phần tử nhỏ nhất trong mảng con {a[dau], .., a[cuoi]} của mảng a.

4.1.2.2 Sắp xếp mảng tăng

Đầu vào: Mảng a0, a1, .., an-1.

Đầu ra: Mảng được sắp xếp tăng dần. a0, a1, .., aN-1 LonNhat LonNhat   i  0 i < N Đúng LonNhat < ai Đúng LonNhat ai Sai Sai i  i + 1

Có nhiều thuật toán sắp xếp mảng, ở đây ta chỉ tìm hiểu thuật toán đổi chỗ trực tiếp (Interchange Sort).

Khái niệm nghịch thế

– Xét một mảng các số a[0], a[1], … a[n-1]

– Nếu có i<j và a[i] > a[j], thì ta gọi đó là một nghịch thế • Mảng chưa sắp xếp sẽ có nghịch thế

• Mảng đã có thứ tự sẽ không chứa nghịch thế a[0] ≤ a[1] ≤ … ≤ a[n -1]

Nhận xét

– Để sắp xếp một dãy số, ta có thể xét các nghịch thế có trong dãy và làm triệt tiêu dần chúng đi

Ý tƣởng

– Xuất phát từ đầu dãy, tìm tất cả nghịch thế chứa phần tử này, triệt tiêu chúng bằng cách đổi chỗ phần tử này với phần tử tương ứng trong cặp nghịch thế

– Lặp lại xử lý trên với các phần tử tiếp theo trong dãy

Thuật toán

// input: mảng (a, n)

// output: mảng (a, n) đã được sắp xếp tăng dần

Bước 1: i = 0; // bắt đầu từ đầu dãy

Bước 2: j = i+1;

Bước 3: Trong khi j < n thực hiện:

• Nếu a[i]>a[j] thì đổi chỗ a[i], a[j] • j = j+1; (adsbygoogle = window.adsbygoogle || []).push({});

Bước 4: i = i+1;

– Nếu (i < n-1): Lặp lại Bước 2 – Ngược lại: Dừng

Cài đặt

for (int i=0 ; i<n-1 ; i++)

for (int j=i+1; j<n ; j++)

if(a[i]>a[j]) //nếu có nghịch thế thì đổi chỗ {

t=a[i]; a[i]=a[j]; a[j]=t; }

4.1.2.3. Tìm kiếm vị trí của phần tử X trong mảng a0, a1, .., aN-1

Hình 4.3: Thuật toán tìm kiếm vị trí của phần tử trong mảng.

Cài đặt:

mang_nguyen a; int i = 0, vt, X; while (i<n && a[i] != x)

i++;

if (i = = n) vt = -1; // Không có x trong a else vt = i; // Có x trong a ở vị trí i

Một phần của tài liệu Bài giảng Tin học đại cương (Trang 52)