Download as pdf or txt
Download as pdf or txt
You are on page 1of 41

Trang 1

Hiểu nhu cầu phân loại dữ liệu


Bản ghi dữ liệu được lưu trữ tồn tại theo một số loại thứ tự; nghĩa là, một bản ghi là đầu tiên, một bản ghi thứ hai và
Sớm. Khi các bản ghi theo thứ tự tuần tự , chúng được sắp xếp lần lượt trên cơ sở
của giá trị trong một trường cụ thể. Ví dụ bao gồm hồ sơ nhân viên được lưu trữ theo thứ tự số
theo số An sinh xã hội hoặc số bộ phận, hoặc theo thứ tự bảng chữ cái theo họ hoặc
Tên bộ phận. Ngay cả khi các bản ghi dường như không được lưu trữ theo bất kỳ thứ tự cụ thể nào — đối với
ví dụ, nếu chúng theo thứ tự mà nhân viên bán hàng cảm thấy muốn nhập chúng — chúng vẫn tồn tại một
sau cái khác, mặc dù có thể không theo thứ tự mong muốn để xử lý hoặc xem. Dữ liệu
các bản ghi được lưu trữ ngẫu nhiên hoặc không theo thứ tự cần thiết cho một
ứng dụng, cần được sắp xếp. Như bạn đã học trong Chương 7, sắp xếp các bản ghi là quá trình
sắp xếp chúng theo thứ tự dựa trên nội dung của một hoặc nhiều trường. Bạn có thể sắp xếp dữ liệu trong
thứ tự tăng dần, sắp xếp các bản ghi từ giá trị thấp nhất đến cao nhất trong một trường hoặc trong
thứ tự giảm dần, sắp xếp các bản ghi từ giá trị cao nhất đến thấp nhất.

Quá trình sắp xếp thường được dành riêng cho một số lượng tương đối nhỏ các mục dữ liệu. Nếu hàng nghìn khách hàng
các bản ghi được lưu trữ và chúng thường xuyên cần được truy cập theo thứ tự dựa trên các trường khác nhau (theo thứ tự bảng chữ cái
đặt hàng theo tên khách hàng một ngày, đặt hàng mã zip vào ngày tiếp theo), các bản ghi có thể sẽ không được sắp xếp,
nhưng sẽ được lập chỉ mục hoặc liên kết. Bạn tìm hiểu về lập chỉ mục và liên kết ở phần sau của chương này.

Dưới đây là một số ví dụ về các trường hợp khi bạn cần sắp xếp các bản ghi:
Một trường đại học lưu trữ hồ sơ sinh viên theo thứ tự tăng dần theo số ID sinh viên, nhưng
công ty đăng ký muốn xem dữ liệu theo thứ tự giảm dần theo giờ tín dụng kiếm được để anh ta có thể
liên hệ với những sinh viên sắp tốt nghiệp.
Một cửa hàng bách hóa lưu giữ hồ sơ khách hàng theo thứ tự tăng dần theo số khách hàng,
nhưng vào cuối thời hạn thanh toán, người quản lý tín dụng muốn liên hệ với những khách hàng có
số dư quá hạn từ 90 ngày trở lên. Người quản lý muốn liệt kê những khách hàng quá hạn này
theo thứ tự giảm dần theo số tiền nợ, vì vậy khách hàng có khoản nợ lớn nhất có thể
liên hệ trước.
Người quản lý bán hàng lưu giữ hồ sơ cho các nhân viên bán hàng của cô ấy theo thứ tự bảng chữ cái theo họ, nhưng
cô ấy cần liệt kê số liệu bán hàng hàng năm cho từng nhân viên bán hàng để có thể xác định
số tiền bán hàng năm trung bình.

Giá trị trung bình trong danh sách là giá trị của mục ở giữa khi các giá trị được liệt kê theo thứ tự. (Nếu danh sách
chứa một số giá trị chẵn, trung vị là nửa giữa hai giá trị giữa.) Trung vị là
không giống như trung bình số học, hoặc trung bình . Trung vị thường được sử dụng làm thống kê vì nó
đại diện cho một trường hợp điển hình hơn — một nửa giá trị nằm dưới nó và một nửa nằm trên nó. Không giống như mức trung bình,
giá trị trung bình bị lệch bởi một vài giá trị rất cao hoặc thấp.

Người quản lý cửa hàng muốn tạo báo cáo ngắt kiểm soát trong đó liệt kê các đợt bán hàng riêng lẻ
theo thứ tự trong nhóm theo bộ phận của họ. Như bạn đã học trong Chương 7, khi bạn tạo
báo cáo ngắt kiểm soát, các bản ghi phải được sắp xếp theo thứ tự của ngắt kiểm soát
Trang 2

Khi máy tính sắp xếp dữ liệu, chúng luôn sử dụng các giá trị số để so sánh giữa
các giá trị. Điều này rõ ràng khi bạn sắp xếp các bản ghi theo các trường như ID khách hàng số hoặc số dư
đến hạn. Tuy nhiên, ngay cả các loại chữ cái cũng là số, vì dữ liệu máy tính được lưu trữ dưới dạng
số sử dụng một loạt các số 0 và 1. Người dùng máy tính bình thường ít khi nghĩ đến con số
mã đằng sau các chữ cái, số và dấu câu mà họ nhập từ bàn phím hoặc
xem trên màn hình. Tuy nhiên, họ thấy hậu quả của các giá trị đằng sau các chữ cái khi họ
xem dữ liệu được sắp xếp theo thứ tự bảng chữ cái. Trong mọi sơ đồ mã hóa máy tính phổ biến, B là
về số một lớn hơn A và y nhỏ hơn z một về số. Thật không may, của bạn
hệ thống ra lệnh cho dù A được biểu diễn bằng một số lớn hơn hay nhỏ hơn
số đại diện cho a. Do đó, để có được danh sách hữu ích và chính xác nhất về
hồ sơ được sắp xếp theo thứ tự bảng chữ cái, nhân viên nhập dữ liệu của công ty phải nhất quán trong
việc sử dụng cách viết hoa hoặc lập trình viên nên chuyển đổi tất cả dữ liệu để sử dụng nhất quán
viết hoa. Vì A luôn nhỏ hơn B, nên sắp xếp theo thứ tự bảng chữ cái là sắp xếp tăng dần.

Các chương trình mã hóa phổ biến nhất bao gồm ASCII, Unicode và EBCDIC. Trong mỗi mã, một số đại diện cho
một ký tự máy tính cụ thể. Phụ lục A chứa thông tin bổ sung về các mã này.

Là một lập trình viên chuyên nghiệp, bạn có thể không bao giờ phải viết một chương trình sắp xếp dữ liệu, bởi vì
các tổ chức có thể mua các chương trình phân loại được viết sẵn, "đóng hộp". Ngoài ra, nhiều phổ biến
trình biên dịch ngôn ngữ đi kèm với các phương thức tích hợp có thể sắp xếp dữ liệu cho bạn. Tuy nhiên nó là
có lợi khi hiểu quy trình sắp xếp để bạn có thể viết một loại có mục đích đặc biệt khi
cần thiết. Hiểu quy trình sắp xếp cũng cải thiện kỹ năng thao tác mảng của bạn.

HAI SỰ THẬT & MỘT LỜI NÓI DỐI


Hiểu nhu cầu phân loại dữ liệu

1. Khi bạn sắp xếp dữ liệu theo thứ tự tăng dần, bạn sắp xếp các bản ghi từ thấp nhất đến
cao nhất dựa trên giá trị trong một trường cụ thể.

2. Thứ tự bảng chữ cái bình thường, trong đó A đứng trước B, là thứ tự giảm dần.

3. Khi máy tính sắp xếp dữ liệu, chúng sử dụng các giá trị số để so sánh, thậm chí
khi các giá trị chuỗi được so sánh.

Sử dụng thuật toán sắp xếp bong bóng


Một trong những kỹ thuật sắp xếp đơn giản nhất để hiểu là sắp xếp bong bóng. Bạn có thể sử dụng bong bóng
sắp xếp để sắp xếp các mục dữ liệu theo thứ tự tăng dần hoặc giảm dần. Theo cách sắp xếp bong bóng , các mục trong một
danh sách được so sánh với nhau theo cặp. Khi một mặt hàng không được đặt hàng, nó sẽ giao dịch các nơi, hoặc
đã hoán đổi, với mục bên dưới nó. Với cách sắp xếp bong bóng tăng dần, sau mỗi cặp liền kề của
Trang 3

các mục trong danh sách đã được so sánh một lần, mục lớn nhất trong danh sách sẽ "chìm" vào
dưới cùng. Sau nhiều lần lướt qua danh sách, các mục nhỏ nhất sẽ tăng lên đầu giống như bong bóng trong một
đồ uống có ga. Loại bong bóng đôi khi được gọi là loại chìm .

Khi bạn học một phương pháp như sắp xếp, các lập trình viên nói rằng bạn đang học một thuật toán. An
thuật toán là một danh sách các hướng dẫn hoàn thành một nhiệm vụ. Trong phần này, bạn sẽ tìm hiểu về
thuật toán sắp xếp bong bóng để sắp xếp danh sách các giá trị đơn giản; phần sau của chương này bạn sẽ học
thêm về cách sắp xếp các bản ghi nhiều trường. Để hiểu thuật toán sắp xếp bong bóng, bạn
đầu tiên phải tìm hiểu về hoán đổi giá trị.

Hiểu các giá trị hoán đổi


Một khái niệm trung tâm của nhiều thuật toán sắp xếp, bao gồm cả sắp xếp bong bóng, là ý tưởng về
hoán đổi giá trị. Khi bạn hoán đổi các giá trị được lưu trữ trong hai biến, bạn sẽ trao đổi các giá trị của chúng;
bạn đặt biến đầu tiên bằng giá trị của biến thứ hai và biến thứ hai bằng
giá trị của cái đầu tiên. Tuy nhiên, có một mẹo để hoán đổi hai giá trị bất kỳ. Giả sử rằng bạn có
khai báo hai biến như sau:
điểm số1 = 90
điểm số2 = 85

Bạn muốn trao đổi các giá trị để score1 là 85 và score2 là 90. Nếu bạn lần đầu tiên assign score1
để score2 sử dụng một tuyên bố như score2 = score1 , cả score1 và score2 giữ 90, và
giá trị 85 bị mất. Tương tự, nếu bạn lần đầu tiên assign score2 để score1 sử dụng một tuyên bố như
score1 = score2 , cả hai biến đều giữ 85 và giá trị 90 bị mất.
Để hoán đổi chính xác hai giá trị, bạn tạo một biến tạm thời để giữ một bản sao của một trong các giá trị
điểm số để nó không bị mất. Sau đó, bạn có thể thực hiện hoán đổi như trong Hình 8-1. Đầu tiên,
giá trị trong score2 , 85, được gán cho một biến giữ tạm thời có tên là temp . Sau đó,
giá trị score1 , 90, được gán cho score2 . Tại thời điểm này, cả hai score1 và score2 giữ 90. Sau đó,
85 ở nhiệt độ được chỉ định cho điểm1 . Do đó, sau quá trình hoán đổi, điểm 1 giữ 85 và
Score2 giữ 90.
Trang 4

Hình 8-1 Đoạn chương trình hoán đổi hai giá trị

Trong Hình 8-1, bạn có thể đạt được các kết quả giống hệt nhau bằng cách gán điểm số 1 cho tạm thời , chỉ định
score2 để score1 , và cuối cùng gán tạm thời để score2 .

Hiểu cách sắp xếp bong bóng


Giả sử rằng bạn muốn sắp xếp năm điểm kiểm tra của học sinh theo thứ tự tăng dần. Hình 8-2 cho thấy một
​​
chương trình trong đó một hằng số được khai báo để giữ kích thước của một mảng, và sau đó mảng được khai báo
để giữ năm điểm. (Các biến và hằng số khác, được tô bóng trong hình, sẽ là
được thảo luận trong các đoạn tiếp theo khi chúng được sử dụng.) Chương trình gọi ba chính
thủ tục — một để nhập năm điểm, một để sắp xếp chúng và một cuối cùng để hiển thị
kết quả được sắp xếp.

Trong Chương 6, bạn đã biết rằng nhiều ngôn ngữ hiện đại cho phép bạn sử dụng giá trị tích hợp sẵn làm kích thước mảng,
điều này giúp bạn giảm bớt yêu cầu khai báo một hằng số cho kích thước. Bởi vì tên của tích hợp sẵn
giá trị khác nhau giữa các ngôn ngữ lập trình, các ví dụ trong chương này sử dụng một hằng số được khai báo, được đặt tên.
Trang 5

Hình 8-2 Logic dòng chính cho chương trình chấp nhận, sắp xếp và hiển thị điểm
Trang 6

Sử dụng thuật toán sắp xếp bong bóng

Hình 8-3 cho thấy phương thức fillArray () . Trong phương thức, một chỉ số con, x , được khởi tạo thành
0 và lần lượt từng phần tử mảng được điền. Sau khi người dùng nhập năm điểm, quyền kiểm soát trở lại
chương trình chính.

Hình 8-3 Phương thức fillArray ()


Trang 7

Phương thức sortArray () trong Hình 8-4 sắp xếp các phần tử mảng bằng cách tạo một chuỗi
so sánh các giá trị phần tử liền kề và hoán đổi chúng nếu chúng không theo thứ tự. Để bắt đầu
sắp xếp danh sách điểm này, bạn so sánh hai điểm đầu tiên, điểm số [0] và điểm số [1] . Nếu họ
không theo thứ tự — nghĩa là, nếu điểm số [0] lớn hơn điểm số [1] —bạn muốn đảo ngược
vị trí hoặc hoán đổi giá trị của chúng.

Đừng làm điều đó


Loạt so sánh này
vẫn chưa hoàn thành.
Hình 8-6 cho thấy một
đầy đủ, phương pháp làm việc.

Hình 8-4 Phương thức sortArray () không đầy đủ

Ví dụ: giả sử rằng năm điểm đã nhập là:


điểm [0] = 90
điểm [1] = 85
điểm [2] = 65
điểm [3] = 95
điểm [4] = 75

Trong danh sách này, điểm [0] là 90 và điểm [1] là 85; bạn muốn trao đổi giá trị của cả hai
các phần tử để giá trị nhỏ hơn kết thúc sớm hơn trong mảng. Bạn gọi phương thức swap () ,
đặt điểm số theo thứ tự tốt hơn một chút so với ban đầu. Hình 8-5 cho thấy
phương thức swap () . Mô-đun này chuyển đổi hai phần tử liền kề bất kỳ trong mảng điểm số .
Trang 8

Hình 8-5 Phương thức swap ()

Trong Hình 8-4, số lượng so sánh được thực hiện dựa trên giá trị của hằng số có tên
COMPS ,được khởi tạo thành giá trị SIZE - 1 . Đó là, đối với một mảng có kích thước 5, COMPS
hằng số sẽ là 4. Do đó, các so sánh sau được thực hiện:
điểm [0]> điểm [1]
điểm [1]> điểm [2]
điểm [2]> điểm [3]
điểm [3]> điểm [4]

Mỗi phần tử trong mảng được so sánh với phần tử theo sau nó. Khi x trở thành COMPS ,
các trong khi vòng lặp kết thúc. Nếu vòng lặp tiếp tục khi x trở thành COMPS , thì vòng lặp tiếp theo
so sánh sẽ sử dụng điểm số [4] và điểm số [5] . Điều này sẽ gây ra lỗi vì
chỉ số con cao nhất được phép trong một mảng năm phần tử là 4. Bạn phải đánh giá biểu thức
điểm [x]> điểm [x + 1] bốn lần — khi x là 0, 1, 2 và 3.
Đối với sắp xếp tăng dần, bạn cần thực hiện phương thức swap () bất cứ khi nào bất kỳ phần tử nhất định nào
của mảng điểm có giá trị lớn hơn phần tử tiếp theo. Với x bất kỳ , nếu phần tử thứ x là
không lớn hơn phần tử ở vị trí x + 1 , việc hoán đổi sẽ không diễn ra. Ví dụ,
khi điểm [x] là 90 và điểm [x + 1] là 85, hoán đổi sẽ xảy ra. Mặt khác,
khi điểm số [x] là 65 và điểm số [x + 1] là 95, thì sẽ không xảy ra hoán đổi.
Đối với sắp xếp giảm dần mà bạn muốn kết thúc bằng giá trị cao nhất trước tiên, bạn sẽ viết
quyết định để bạn thực hiện chuyển đổi khi điểm số [x] nhỏ hơn điểm số [x + 1] .
Là một ví dụ hoàn chỉnh về cách ứng dụng này hoạt động bằng cách sử dụng sắp xếp tăng dần, giả sử rằng
bạn có những điểm số ban đầu này:
điểm [0] = 90
điểm [1] = 85
điểm [2] = 65
điểm [3] = 95
điểm [4] = 75
Trang 9

Logic của phương thức sortArray () tiến hành như sau:


1. Đặt x thành 0.

2. Giá trị của x nhỏ hơn 4 ( COMPS ), vì vậy hãy nhập vòng lặp.
3. So sánh điểm [x] , 90, với điểm [x + 1] , 85. Hai điểm không theo thứ tự, vì vậy
chúng được đổi chỗ cho nhau.

Danh sách bây giờ là:


điểm [0] = 85
điểm [1] = 90
điểm [2] = 65
điểm [3] = 95
điểm [4] = 75

4. Sau khi hoán đổi, thêm 1 vào x , do đó x là 1.


5. Quay trở lại phần trên cùng của vòng lặp. Giá trị của x là nhỏ hơn 4, vì vậy hãy nhập vòng lặp lần thứ hai.

6. So sánh điểm [x] , 90, với điểm [x + 1] , 65. Hai giá trị này không theo thứ tự, vì vậy
hoán đổi chúng.

Bây giờ kết quả là:

điểm [0] = 85
điểm [1] = 65
điểm [2] = 90
điểm [3] = 95
điểm [4] = 75

7. Thêm 1 vào x , do đó x bây giờ là 2.

8. Quay lại đầu vòng lặp. Giá trị của x nhỏ hơn 4, vì vậy hãy nhập vòng lặp.
9. So sánh điểm số [x] , 90, với điểm số [x + 1] , 95. Các giá trị này theo thứ tự, vì vậy không có sự hoán đổi
là cần thiết.
10. Thêm 1 vào x , tạo thành 3.

11. Quay lại đầu vòng lặp. Giá trị của x nhỏ hơn 4, vì vậy hãy nhập vòng lặp.
12. So sánh điểm số [x] , 95, với điểm số [x + 1] , 75. Hai giá trị này không theo thứ tự, vì vậy
hoán đổi chúng.

Bây giờ danh sách như sau:


điểm [0] = 85
điểm [1] = 65
điểm [2] = 90
điểm [3] = 75
điểm [4] = 95

13. Thêm 1 vào x , tạo thành 4.

14. Quay lại đầu vòng lặp. Giá trị của x là 4, do đó không nhập lại vòng lặp.
Trang 10

Khi x đạt đến 4, mọi phần tử trong danh sách đã được so sánh với phần tử liền kề với nó.
Điểm cao nhất, 95, đã "chìm" xuống cuối danh sách. Tuy nhiên, điểm số vẫn không ở
đặt hàng. Chúng theo thứ tự tăng dần tốt hơn một chút so với khi quá trình bắt đầu,
vì giá trị lớn nhất nằm ở cuối danh sách, nhưng chúng vẫn không theo thứ tự. Bạn cần phải
lặp lại toàn bộ quy trình sao cho 85 và 65 ( điểm hiện tại [0] và điểm [1] giá trị)
có thể chuyển đổi vị trí và 90 và 75 ( điểm số hiện tại [2] và điểm số [3] giá trị) có thể chuyển đổi
nơi. Sau đó, điểm số sẽ là 65, 85, 75, 90 và 95. Bạn sẽ phải xem qua danh sách
một lần nữa để hoán đổi 85 và 75.
Trên thực tế, nếu điểm số bắt đầu theo thứ tự tồi tệ nhất có thể (95, 90, 85, 75, 65),
quá trình so sánh sẽ phải diễn ra bốn lần. Nói cách khác, bạn sẽ phải
chuyển qua danh sách các giá trị bốn lần, thực hiện các hoán đổi thích hợp, trước các số
sẽ xuất hiện theo thứ tự tăng dần hoàn hảo. Bạn cần đặt vòng lặp trong Hình 8-4 trong
một vòng lặp khác thực hiện bốn lần.

Hình 8-6 cho thấy logic hoàn chỉnh cho mô-đun sortArray () . Mô-đun sử dụng một vòng lặp
biến điều khiển có tên là y để xem qua danh sách điểm bốn lần. (Khởi tạo,
so sánh và thay đổi của biến điều khiển vòng lặp này được tô bóng trong hình.)
mảng năm phần tử, cần bốn phép so sánh để hoạt động qua mảng một lần, so sánh
mỗi cặp và cần bốn bộ so sánh đó để đảm bảo rằng mọi phần tử trong
toàn bộ mảng được sắp xếp theo thứ tự. Trong phương thức sortArray () trong Hình 8-6, x phải được đặt lại về 0
cho mỗi giá trị mới của y để các phép so sánh luôn bắt đầu ở đầu danh sách.
Trang 11

Hình 8-6 Phương thức sortArray () đã hoàn thành


Trang 12

Sử dụng thuật toán sắp xếp bong bóng

Khi bạn sắp xếp các phần tử trong một mảng theo cách này, bạn sử dụng các vòng lặp lồng nhau — một vòng lặp bên trong
hoán đổi các cặp không theo thứ tự và một vòng lặp ngoài đi qua danh sách nhiều lần. Các
các quy tắc chung để thực hiện so sánh với sắp xếp bong bóng là:

Số lượng so sánh cặp lớn nhất bạn cần thực hiện trong mỗi vòng lặp là ít hơn một
hơn số phần tử trong mảng. Bạn sử dụng một vòng lặp bên trong để làm cặp
so sánh.
Số lần bạn cần xử lý danh sách các giá trị nhỏ hơn một lần so với số
các phần tử trong mảng. Bạn sử dụng một vòng ngoài để kiểm soát số lần bạn đi bộ
thông qua danh sách.
Ví dụ: nếu bạn muốn sắp xếp một mảng 10 phần tử, bạn thực hiện so sánh chín cặp trên
mỗi lần trong số chín lần lặp qua vòng lặp, thực hiện tổng cộng 81 câu lệnh so sánh điểm.

Phương pháp cuối cùng được gọi bởi chương trình phân loại điểm trong Hình 8-2 là phương thức hiển thị
​​
nội dung mảng đã sắp xếp. Hình 8-7 cho thấy phương pháp này.

Hình 8-7 Phương thức displayArray ()


Trang 13

Sắp xếp danh sách các kích thước biến đổi


Trong chương trình sắp xếp điểm ở phần trước, hằng số SIZE đã được khởi tạo cho
số phần tử được sắp xếp khi bắt đầu chương trình. Tuy nhiên, đôi khi bạn không
muốn tạo một giá trị như vậy vì bạn có thể không biết có bao nhiêu phần tử mảng sẽ chứa
giá trị hợp lệ. Ví dụ: trong một lần chạy chương trình, bạn có thể chỉ muốn sắp xếp ba hoặc bốn
và trong một lần chạy khác, bạn có thể muốn sắp xếp 20. Nói cách khác, điều gì sẽ xảy ra nếu kích thước của
danh sách được sắp xếp có thể khác nhau? Thay vì sắp xếp một số phần tử mảng cố định, bạn có thể
đếm điểm đầu vào và sau đó sắp xếp nhiều.
Để theo dõi số lượng phần tử được lưu trữ trong một mảng, bạn có thể tạo ứng dụng
được hiển thị trong Hình 8-8. Như trong phiên bản gốc của chương trình, bạn gọi fillArray ()
và khi bạn nhập mỗi điểm, bạn tăng x 1 để xếp mỗi điểm mới vào
phần tử liên tiếp của mảng điểm . Sau khi bạn nhập một giá trị và đặt nó vào đầu tiên
phần tử của mảng điểm , x là 1. Sau khi điểm thứ hai được nhập và đặt vào điểm [1] , x là
2, và như vậy. Sau khi bạn đạt đến cuối đầu vào, x là số điểm đã được
được đặt trong mảng, vì vậy bạn có thể lưu trữ x trong numberOfEls và tính toán các phép so sánh như
numberOfEls - 1 .
Với cách tiếp cận này, không có vấn đề gì nếu không có đủ giá trị để điền vào
các điểm mảng. Các phương thức sortArray () và displayArray () sử dụng các phép so sánh và
numberOfEls thayvì COMPS và SIZE để xử lý mảng. Ví dụ: nếu 35 điểm là
input, numberOfEls sẽ được đặt thành 35 trong mô-đun fillArray () và khi chương trình sắp xếp,
nó sẽ sử dụng 34 làm điểm giới hạn cho số lượng so sánh cặp cần thực hiện. Sự sắp xếp
chương trình sẽ không bao giờ thực hiện so sánh cặp trên các phần tử mảng 36 đến 100 — những
các yếu tố sẽ chỉ “ngồi đó”, không bao giờ liên quan đến việc so sánh hoặc hoán đổi.
Trang 14

Hình 8-8 Ứng dụng sắp xếp theo điểm trong đó số phần tử cần sắp xếp có thể khác nhau (tiếp theo)
Trang 15

Hình 8-8 Ứng dụng sắp xếp theo điểm trong đó số phần tử cần sắp xếp có thể khác nhau (tiếp theo)
Trang 16

Sử dụng thuật toán sắp xếp bong bóng

Hình 8-8 Ứng dụng sắp xếp điểm trong đó số lượng phần tử cần sắp xếp có thể khác nhau
Trang 17

Trong phương thức fillArray () trong Hình 8-8, lưu ý rằng một số đọc mồi đã được thêm vào phương thức. Nếu
người dùng nhập giá trị QUIT ở đầu vào đầu tiên, sau đó số phần tử được sắp xếp sẽ là 0.

Khi bạn đếm các giá trị đầu vào và sử dụng biến numberOfEls , không thành vấn đề nếu
không có đủ điểm để điền vào mảng. Tuy nhiên, sẽ xảy ra lỗi nếu bạn cố gắng lưu trữ
nhiều giá trị hơn mảng có thể chứa. Khi bạn không biết có bao nhiêu phần tử sẽ được lưu trữ
trong một mảng, bạn phải ước tính quá số phần tử bạn khai báo.

Tinh chỉnh sắp xếp bong bóng để giảm bớt các so sánh không cần thiết
Bạn có thể thực hiện các cải tiến bổ sung đối với sắp xếp bong bóng đã tạo trong các phần trước.
Như minh họa trong Hình 8-8, khi bạn thực hiện mô-đun sắp xếp cho sắp xếp bong bóng, bạn vượt qua
thông qua danh sách, so sánh và hoán đổi giá trị nếu hai giá trị liền kề nằm ngoài
đặt hàng. Nếu bạn đang thực hiện sắp xếp tăng dần và bạn đã thực hiện một lần trong danh sách,
giá trị lớn nhất được đảm bảo ở đúng vị trí cuối cùng của nó ở cuối danh sách.
Tương tự, phần tử lớn thứ hai được đảm bảo ở đúng vị trí từ thứ hai đến cuối cùng của nó
sau lần thứ hai đi qua danh sách, v.v. Nếu bạn tiếp tục so sánh mọi yếu tố
ghép nối trên mỗi lần chuyển qua danh sách, bạn đang so sánh các phần tử đã được đảm bảo
ở vị trí chính xác cuối cùng của họ. Nói cách khác, sau lần đầu tiên lướt qua danh sách, bạn không
còn cần kiểm tra phần tử dưới cùng; sau lần vượt qua thứ hai, bạn không cần phải kiểm tra
hai phần tử dưới cùng.
Trên mỗi lần đi qua mảng, bạn có thể đủ khả năng để dừng so sánh cặp của mình một phần tử
sớm hơn. Bạn có thể tránh so sánh các giá trị đã có bằng cách tạo một
biến, cặpToCompare và đặt giá trị ban đầu của nó thành numberOfEls - 1 . Trong lần vượt qua đầu tiên
thông qua danh sách, mọi cặp phần tử đều được so sánh, vì vậy các cặp phần tửToCompare phải bằng nhau
numberOfEls - 1 .
Nói cách khác, với năm phần tử mảng để sắp xếp, bốn cặp được so sánh,
và với 50 phần tử để sắp xếp, 49 cặp được so sánh. Trên mỗi lần tiếp theo, hãy đi qua
danh sách, cặpToCompare nên được giảm đi 1; ví dụ: sau khi hoàn thành lần vượt qua đầu tiên, nó
không cần thiết để kiểm tra phần tử dưới cùng. Xem Hình 8-9 để kiểm tra việc sử dụng
biến cặpToC so sánh .
Trang 18

Hình 8-9 Lưu đồ và mã giả cho phương thức sortArray () sử dụng biến cặpToCompare
Trang 19

Tinh chỉnh sắp xếp bong bóng để loại bỏ các đường chuyền không cần thiết
Bạn cũng có thể cải thiện mô-đun sắp xếp bong bóng trong Hình 8-9 bằng cách giảm số lượng
đi qua mảng. Nếu các phần tử của mảng không đúng thứ tự, nhiều phần tử đi qua
danh sách được yêu cầu để đặt nó theo thứ tự; nó cần ít hơn một lần vượt qua giá trị trong numberOfEls để
hoàn thành tất cả các so sánh và hoán đổi cần thiết để sắp xếp danh sách. Tuy nhiên, khi mảng
các phần tử theo thứ tự hoặc gần như bắt đầu, tất cả các phần tử có thể được sắp xếp chính xác
chỉ sau một vài lần lướt qua danh sách. Tất cả các lượt đi tiếp theo không dẫn đến hoán đổi. Ví dụ,
giả định rằng điểm số ban đầu như sau:
điểm [0] = 65
điểm [1] = 75
điểm [2] = 85
điểm [3] = 90
điểm [4] = 95

Mô-đun sắp xếp bong bóng trong Hình 8-9 sẽ chuyển qua danh sách mảng bốn lần, làm cho
bốn bộ so sánh cặp. Nó sẽ luôn luôn thấy rằng mỗi điểm [x] không lớn hơn
điểm tương ứng [x + 1] , vì vậy sẽ không có chuyển đổi nào được thực hiện. Điểm số sẽ kết thúc
theo thứ tự thích hợp, nhưng ngay từ đầu chúng đã có thứ tự thích hợp; do đó, rất nhiều thời gian
sẽ bị lãng phí.

Cách khắc phục khả thi là thêm biến cờ được đặt thành giá trị “tiếp tục” trên bất kỳ lần chuyển nào qua
danh sách trong đó bất kỳ cặp phần tử nào được hoán đổi (ngay cả khi chỉ là một cặp) và
giá trị "hoàn thành" khác nhau khi không có hoán đổi nào được thực hiện — nghĩa là khi tất cả các phần tử trong danh sách
đã theo đúng thứ tự. Ví dụ: bạn có thể tạo một biến có tên didSwap và đặt nó
thành "Không" ở đầu mỗi lần chuyển qua danh sách. Bạn có thể thay đổi giá trị của nó thành "Có" mỗi lần
các swap () mô-đun được thực hiện (có nghĩa là, mỗi lần chuyển đổi là cần thiết).
Nếu bạn vượt qua toàn bộ danh sách các cặp mà không thực hiện chuyển đổi, cờ didSwap sẽ
chưa được đặt thành "Có" , nghĩa là không có hoán đổi nào xảy ra và các phần tử mảng
phải theo đúng thứ tự. Tình huống này có thể xảy ra ở lượt đi thứ nhất hoặc thứ hai
thông qua danh sách mảng, hoặc nó có thể không xảy ra cho đến khi vượt qua nhiều lần sau. Khi các phần tử mảng
theo đúng thứ tự, bạn có thể dừng việc chuyển qua danh sách.

Hình 8-10 minh họa một mô-đun sắp xếp điểm số và sử dụng cờ didSwap . Vào đầu của
các sortArray () mô-đun, khởi didSwap để "Yes" trước khi vào so sánh vòng lặp
lần đầu tiên. Sau đó, ngay lập tức đặt didSwap thành "Không" . Khi một công tắc xảy ra — nghĩa là, khi
thực thi mô-đun swap () — đặt didSwap thành "Có" .
Trang 20

Hình 8-10 Lưu đồ và mã giả cho phương thức sortArray () sử dụng biến didSwap
Trang 21

Với việc bổ sung biến cờ trong Hình 8-10, bạn không cần biến y nữa, biến đó đang giữ
theo dõi số lần đi qua danh sách. Thay vào đó, bạn tiếp tục xem qua danh sách cho đến khi bạn có thể tạo
hoàn thành vượt qua mà không có bất kỳ công tắc.

HAI SỰ THẬT & MỘT LỜI NÓI DỐI


Sử dụng thuật toán sắp xếp bong bóng

1. Bạn có thể sử dụng sắp xếp bong bóng để sắp xếp các bản ghi theo thứ tự tăng dần hoặc giảm dần.

2. Trong sắp xếp bong bóng, các mục trong danh sách được so sánh với nhau theo từng cặp và khi
mục không theo thứ tự, nó sẽ hoán đổi giá trị với mục bên dưới nó.

3. Với bất kỳ sắp xếp bong bóng nào, sau khi mỗi cặp mục liền kề trong danh sách đã được so sánh
một khi, mục lớn nhất trong danh sách sẽ bị "chìm" xuống đáy.

Sắp xếp các bản ghi đa trường


Thuật toán sắp xếp bong bóng rất hữu ích để sắp xếp danh sách các giá trị, chẳng hạn như danh sách điểm kiểm tra trong
thứ tự tăng dần hoặc danh sách tên theo thứ tự bảng chữ cái. Hồ sơ, tuy nhiên, hầu hết
thường bao gồm nhiều trường. Khi bạn muốn sắp xếp các bản ghi, bạn cần thực hiện
chắc chắn dữ liệu thuộc về nhau vẫn ở cùng nhau. Khi bạn sắp xếp hồ sơ, có hai cách tiếp cận bạn
có thể là đặt các mục dữ liệu có liên quan trong các mảng song song và sắp xếp các bản ghi như một tổng thể.

Sắp xếp dữ liệu được lưu trữ trong các mảng song song
Giả sử rằng bạn có các mảng song song chứa tên học sinh và điểm kiểm tra, như mảng
được hiển thị trong Hình 8-11. Tên của mỗi học sinh xuất hiện ở cùng một vị trí tương đối trong tên
mảng khi điểm kiểm tra của người đó xuất hiện trong mảng điểm . Hơn nữa, giả sử rằng bạn muốn
sắp xếp tên học sinh và điểm số của họ theo thứ tự bảng chữ cái. Nếu bạn sử dụng thuật toán sắp xếp trên
các tên mảng để đặt tên theo thứ tự chữ cái, tên mà bắt đầu ở vị trí 3,
Anna, sẽ kết thúc ở vị trí 0. Nếu bạn cũng lơ là trong việc sắp xếp lại mảng điểm , Anna’s
tên sẽ không còn ở cùng vị trí tương đối với điểm của cô ấy, là 85. Lưu ý rằng
bạn không muốn sắp xếp các giá trị trong mảng điểm . Nếu bạn làm vậy, điểm số [2] , 60, sẽ di chuyển
đến vị trí 0, và đó không phải là điểm của Anna. Thay vào đó, khi bạn sắp xếp các tên, bạn muốn
đảm bảo rằng mỗi điểm tương ứng được chuyển đến cùng vị trí với tên mà
nó thuộc về.
Trang 22

Hình 8-11 Sự xuất hiện của các mảng tên và điểm trong bộ nhớ

Hình 8-12 cho thấy mô-đun swap () cho một chương trình sắp xếp tên các giá trị mảng trong
thứ tự bảng chữ cái và di chuyển điểm số các giá trị mảng tương ứng. Phiên bản này của swap ()
mô-đun sử dụng hai biến tạm thời — một chuỗi có tên tempName và một biến số
được đặt tên là tempScore . Phương thức swap () thực thi bất cứ khi nào hai tên ở vị trí x và x + 1
không theo thứ tự. Bên cạnh việc hoán đổi tên ở các vị trí x và x + 1 , mô-đun cũng hoán đổi
điểm ở các vị trí giống nhau. Do đó, điểm của mỗi học sinh luôn di chuyển cùng với
tên học sinh.

Hình 8-12 Phương thức swap () cho một chương trình sắp xếp tên học sinh và giữ lại
điểm chính xác của họ
Trang 23

Sắp xếp các bản ghi như một tổng thể


Trong hầu hết các ngôn ngữ lập trình hiện đại, bạn có thể tạo các mục nhóm có thể
thao tác dễ dàng hơn các mục dữ liệu đơn lẻ. (Lần đầu tiên bạn biết về những tên nhóm như vậy trong
Chương 7.) Tạo tên nhóm cho một tập hợp các trường dữ liệu liên quan có lợi khi bạn muốn
để di chuyển các mục dữ liệu có liên quan với nhau, như khi bạn sắp xếp các bản ghi có nhiều trường. Những
các mục nhóm đôi khi được gọi là cấu trúc, nhưng thường xuyên hơn được tạo dưới dạng các lớp.
Chương 10 và 11 cung cấp nhiều chi tiết hơn về cách tạo các lớp, nhưng hiện tại, hãy hiểu
mà bạn có thể tạo một mục nhóm với cú pháp tương tự như sau:
lớp StudentRecord
tên chuỗi
điểm số
endClass

Để sắp xếp hồ sơ học sinh bằng cách sử dụng tên nhóm, bạn có thể làm như sau:
Xác định một lớp có tên StudentRecord , như được hiển thị trong mã trước đó.
Xác định những gì lớn hơn có nghĩa cho một StudentRecord . Ví dụ: để sắp xếp các bản ghi theo
tên sinh viên, bạn sẽ xác định lớn hơn để so sánh các giá trị tên , không phải giá trị điểm số .
Quá trình tạo định nghĩa này khác nhau giữa các ngôn ngữ lập trình.

Sử dụng thuật toán sắp xếp hoán đổi các mục StudentRecord , bao gồm cả tên và điểm s,
bất cứ khi nào hai StudentRecord không theo thứ tự.

HAI SỰ THẬT & MỘT LỜI NÓI DỐI


Sắp xếp các bản ghi đa trường

1. Để sắp xếp các mảng song song có liên quan, bạn phải sắp xếp từng mảng theo cùng một thứ tự — hoặc
tăng hoặc giảm.

2. Khi bạn sắp xếp các mảng song song có liên quan và hoán đổi các giá trị trong một mảng, bạn phải
đảm bảo rằng tất cả các mảng được liên kết thực hiện hoán đổi tương đối giống nhau.

3. Hầu hết các ngôn ngữ lập trình hiện đại đều cho phép bạn tạo tên nhóm cho
các trường được liên kết trong một bản ghi.
Trang 24

Sử dụng thuật toán sắp xếp chèn


Phân loại bong bóng hoạt động tốt và tương đối dễ hiểu và dễ thao tác, nhưng nhiều
các thuật toán sắp xếp khác đã được phát triển. Ví dụ: khi bạn sử dụng sắp xếp chèn ,
bạn xem xét từng phần tử danh sách một. Nếu một phần tử không theo thứ tự so với bất kỳ phần tử nào trong số
các mục trước đó trong danh sách, bạn di chuyển từng mục trước đó xuống một vị trí và sau đó chèn
phần tử đã thử nghiệm. Sắp xếp chèn tương tự như kỹ thuật mà bạn rất có thể sẽ sử dụng để sắp xếp
một nhóm các đối tượng theo cách thủ công. Ví dụ: nếu một danh sách chứa các giá trị 2, 3, 1 và 4 và bạn
muốn đặt chúng theo thứ tự tăng dần bằng cách sử dụng sắp xếp chèn, bạn kiểm tra các giá trị 2 và 3, nhưng
bạn không di chuyển chúng bởi vì chúng có thứ tự. Tuy nhiên, khi bạn kiểm tra giá trị thứ ba trong
danh sách, 1, bạn di chuyển cả 2 và 3 đến các vị trí sau đó và chèn 1 vào vị trí đầu tiên.

Hình 8-13 cho thấy logic thực hiện sắp xếp chèn tăng dần bằng cách sử dụng năm phần tử
mảng có tên điểm . Giả sử rằng hằng số có tên SIZE đã được đặt thành 5 và năm
điểm trong mảng như sau:
điểm [0] = 90
điểm [1] = 85
điểm [2] = 65
điểm [3] = 95
điểm [4] = 75
Trang 25

Hình 8-13 Lưu đồ và mã giả cho phương thức insertSort ()


Trang 26

Vòng ngoài được tô bóng thay đổi một biến điều khiển vòng lặp x từ 1 đến một nhỏ hơn kích thước của
mảng. Logic tiến hành như sau:
Đầu tiên x được đặt thành 1, và sau đó phần không được đánh bóng ở trung tâm của Hình 8-13 sẽ thực thi.
1. Giá trị của nhiệt độ được đặt thành điểm [1] , là 85 và y được đặt thành 0.
2. Bởi vì y lớn hơn hoặc bằng 0 và điểm số [y] (90) lớn hơn nhiệt độ ,
vòng lặp bên trong được nhập. (Nếu bạn đang thực hiện sắp xếp giảm dần, thì bạn sẽ hỏi
liệu điểm số [y] có nhỏ hơn nhiệt độ hay không .)

3. Giá trị của điểm [1] trở thành 90 và y giảm dần, biến nó thành –1, vì vậy y là không
dài hơn hoặc bằng 0 và vòng lặp bên trong kết thúc.
4. Sau đó, điểm số [0] được đặt thành tạm thời , là 85.
Sau các bước này, 90 được chuyển xuống một vị trí và 85 được chèn vào vị trí đầu tiên,
vì vậy các giá trị mảng có thứ tự tốt hơn một chút so với ban đầu. Các giá trị là
sau:
điểm [0] = 85
điểm [1] = 90
điểm [2] = 65
điểm [3] = 95
điểm [4] = 75

Bây giờ, trong vòng lặp ngoài, x trở thành 2. Logic trong phần không được đánh bóng của Hình 8-13
tiền thu được như sau:

1. Giá trị của tạm thời trở thành 65 và y được đặt thành 1.
2. Giá trị của y lớn hơn hoặc bằng 0 và điểm số [y] (90) lớn hơn nhiệt độ ,
vì vậy vòng lặp bên trong được nhập vào.
3. Giá trị của điểm [2] trở thành 90 và y giảm xuống, khiến nó là 0, do đó, vòng lặp
thực hiện lại.
4. Giá trị của điểm số [1] trở thành 85 và y giảm xuống, biến nó thành –1, do đó, vòng lặp
kết thúc.

5. Khi đó điểm số [0] trở thành 65.


Sau các bước này, các giá trị mảng có thứ tự tốt hơn so với ban đầu, vì 65 và
85 bây giờ cả hai đều đến trước 90:
điểm [0] = 65
điểm [1] = 85
điểm [2] = 90
điểm [3] = 95
điểm [4] = 75
Trang 27

Bây giờ, x trở thành 3. Logic trong Hình 8-13 tiếp tục hoạt động trên danh sách mới như sau:
1. Giá trị của tạm thời trở thành 95 và y được đặt thành 2.
2. Để thực thi vòng lặp, y phải lớn hơn hoặc bằng 0, chính là, và
điểm [y] (90) phải lớn hơn nhiệt độ , nhưng không phải. Vì vậy, vòng lặp bên trong không
hành hình.
3. Do đó, điểm số [2] được đặt thành 90, mà nó đã là 90. Nói cách khác, không có thay đổi
được làm.
Bây giờ, x được tăng lên 4. Logic trong Hình 8-13 diễn ra như sau:
1. Giá trị của tạm thời trở thành 75 và y được đặt thành 3.

2. Giá trị của y lớn hơn hoặc bằng 0 và điểm số [y] (95) lớn hơn nhiệt độ ,
vì vậy vòng lặp bên trong được nhập vào.
3. Giá trị của điểm số [4] trở thành 95 và y giảm xuống, biến nó thành 2, do đó, vòng lặp
thực hiện lại.

4. Giá trị của điểm số [3] trở thành 90 và y giảm xuống, biến nó thành 1, do đó, vòng lặp
thực hiện lại.

5. Giá trị của điểm [2] trở thành 85 và y giảm xuống, làm cho nó 0; điểm số [y]
(65) không còn lớn hơn nhiệt độ (75), do đó, vòng lặp bên trong kết thúc. Nói cách khác,
các điểm 85, 90 và 95 đều được di chuyển xuống một vị trí, nhưng điểm 65 được giữ nguyên.
6. Khi đó điểm số [1] trở thành 75.

Sau các bước này, tất cả các giá trị mảng đã được sắp xếp lại theo thứ tự tăng dần như
sau:
điểm [0] = 65
điểm [1] = 75
điểm [2] = 85
điểm [3] = 90
điểm [4] = 95

Nhiều thuật toán sắp xếp tồn tại ngoài sắp xếp bong bóng và sắp xếp chèn. Bạn có thể muốn điều tra
logic được sử dụng bởi phân loại lựa chọn, phân loại cocktail, phân loại gnome và sắp xếp nhanh.
Trang 28

HAI SỰ THẬT & MỘT LỜI NÓI DỐI


Sử dụng thuật toán sắp xếp chèn

1. Khi bạn sử dụng sắp xếp chèn, bạn xem xét từng phần tử danh sách một và
di chuyển các mục xuống nếu phần tử được kiểm tra phải được chèn trước chúng.

2. Bạn có thể tạo danh sách tăng dần bằng cách sử dụng sắp xếp chèn, nhưng không giảm dần
một.

3. Sắp xếp chèn tương tự như kỹ thuật mà bạn rất có thể sẽ sử dụng để sắp xếp một
nhóm đối tượng theo cách thủ công.

Sử dụng mảng đa chiều


Trong Chương 6, bạn đã biết rằng một mảng là một chuỗi hoặc danh sách các giá trị trong bộ nhớ máy tính, tất cả
có cùng tên và kiểu dữ liệu nhưng được phân biệt bằng các số đặc biệt được gọi là
bảng điểm. Thông thường, tất cả các giá trị trong một mảng đều có điểm chung; ví dụ, họ có thể
đại diện cho danh sách số ID nhân viên hoặc danh sách giá cho các mặt hàng được bán tại cửa hàng.
được gọi là chỉ mục, là một số cho biết vị trí của một mục cụ thể trong một mảng.

Mảng có các phần tử mà bạn có thể truy cập bằng cách sử dụng một chỉ số con là một chiều hoặc
mảng đơn chiều . Mảng chỉ có một thứ nguyên vì dữ liệu của nó có thể được lưu trữ trong
bảng chỉ có một kích thước — chiều cao. Nếu bạn biết vị trí thẳng đứng của một-
phần tử của mảng chiều, bạn có thể tìm thấy giá trị của nó.
Ví dụ: giả sử rằng bạn sở hữu một tòa nhà chung cư và tính năm giá thuê khác nhau
số tiền cho các căn hộ trên các tầng khác nhau (bao gồm cả tầng 0, tầng hầm), như thể hiện trong
Bảng 8-1.
Bạn có thể khai báo mảng sau để giữ
giá trị thuê:
num RENTS_BY_FLR [5] = 350, 400, 475, 600,
1000

Vị trí của bất kỳ giá trị tiền thuê nào trong Bảng 8-1 tùy thuộc
chỉ trên một biến duy nhất — tầng của tòa nhà.
Vì vậy, khi bạn tạo mảng một chiều để
giữ giá trị tiền thuê, bạn chỉ cần một chỉ số phụ để
xác định hàng.
Bảng 8-1 Lịch thuê dựa trên tầng
Trang 29

Tuy nhiên, đôi khi việc định vị một giá trị trong một mảng phụ thuộc vào nhiều hơn một biến. nếu bạn
phải đại diện cho các giá trị trong một bảng hoặc lưới có chứa các hàng và cột thay vì một danh sách,
thì bạn có thể muốn sử dụng một mảng hai chiều . Một mảng hai chiều chứa hai
kích thước: chiều cao và chiều rộng. Có nghĩa là, vị trí của bất kỳ yếu tố nào phụ thuộc vào hai yếu tố.
Ví dụ: nếu giá thuê một căn hộ phụ thuộc vào hai biến số — cả tầng của tòa nhà
và số lượng phòng ngủ — khi đó bạn muốn tạo một mảng hai chiều.

Để làm ví dụ về cách hữu ích của mảng hai chiều, hãy giả sử rằng bạn sở hữu một
tòa nhà chung cư với năm tầng và mỗi tầng đều có các căn hộ studio (không có
phòng ngủ) và căn hộ một và hai phòng ngủ. Bảng 8-2 cho thấy số tiền cho thuê.

Bảng 8-2 Lịch thuê căn cứ vào tầng và số phòng ngủ

Để xác định giá thuê của người thuê, bạn cần biết hai thông tin: tầng ở đâu
cuộc sống của người thuê và số phòng ngủ trong căn hộ. Mỗi phần tử trong một hai-
mảng chiều yêu cầu hai chỉ số con để tham chiếu đến nó — một chỉ số con để xác định
hàng và một giây để xác định cột. Do đó, 15 giá trị thuê cho một hai chiều
mảng dựa trên Bảng 8-2 sẽ được sắp xếp thành năm hàng và ba cột và được xác định
như sau:
num RENTS_BY_FLR_AND_BDRMS [5] [3] = {350, 390, 435},
{400, 440, 480},
{475, 530, 575},
{600, 650, 700},
{1000, 1075, 1150}
Trang 30

Hình 8-14 cho thấy cách mảng thuê một và hai chiều có thể xuất hiện trong máy tính
ký ức.

Hình 8-14 Mảng một và hai chiều trong bộ nhớ

Khi bạn khai báo mảng một chiều, bạn sử dụng một tập hợp các dấu ngoặc vuông sau mảng
loại và tên. Để khai báo một mảng hai chiều, nhiều ngôn ngữ yêu cầu bạn sử dụng hai
tập hợp các dấu ngoặc sau kiểu và tên mảng. Đối với mỗi phần tử trong mảng, tập hợp đầu tiên của
dấu ngoặc vuông chứa số hàng và bộ thứ hai chứa số cột.
Nói cách khác, hai kích thước đại diện cho chiều cao và chiều rộng của mảng.

Thay vì hai tập hợp dấu ngoặc để biểu thị một vị trí trong mảng hai chiều, một số ngôn ngữ sử dụng
một tập hợp các dấu ngoặc đơn nhưng phân tách các chỉ số con bằng dấu phẩy. Do đó, các phần tử trong hàng 1, cột 2
sẽ là RENTS_BY_FLR_AND_BDRMS [1, 2].

Trong khai báo mảng RENTS_BY_FLR_AND_BDRMS , các giá trị được gán cho mỗi hàng
được đặt trong dấu ngoặc nhọn để giúp bạn hình dung vị trí của mỗi số trong mảng.
Hàng đầu tiên của mảng chứa ba giá trị thuê 350, 390 và 435 cho tầng 0; thư hai
hàng giữ 400, 440 và 480 cho tầng 1; và như thế.
Trang 31

Bạn truy cập một giá trị mảng hai chiều bằng cách sử dụng hai chỉ số con, trong đó chỉ số con đầu tiên
đại diện cho hàng và cái thứ hai đại diện cho cột. Ví dụ, một số
các giá trị trong mảng như sau:

RENTS_BY_FLR_AND_BDRMS [0] [0] là 350


RENTS_BY_FLR_AND_BDRMS [0] [1] là 390
RENTS_BY_FLR_AND_BDRMS [0] [2] là 435
RENTS_BY_FLR_AND_BDRMS [4] [0] là 1000
RENTS_BY_FLR_AND_BDRMS [4] [1] là 1075
RENTS_BY_FLR_AND_BDRMS [4] [2] là 1150
Nếu bạn khai báo hai biến để giữ số tầng và số phòng ngủ là num tầng và
số phòng ngủ , tiền thuê của bất kỳ người thuê nào là RENTS_BY_FLR_AND_BDRMS [tầng] [phòng ngủ] .

Khi các nhà toán học sử dụng mảng hai chiều, họ thường gọi nó là ma trận hoặc bảng . Bạn
có thể đã sử dụng bảng tính, là một mảng hai chiều, trong đó bạn cần biết một hàng
số và một ký tự cột để truy cập một ô cụ thể.

Hình 8-15 cho thấy một chương trình liên tục hiển thị giá thuê căn hộ dựa trên người thuê
yêu cầu về vị trí tầng và số phòng ngủ. Lưu ý rằng mặc dù thiết lập quan trọng là
được yêu cầu cung cấp tất cả các giá trị cho tiền thuê, chương trình cơ bản cực kỳ ngắn gọn và dễ dàng
để làm theo. (Bạn có thể cải thiện chương trình trong Hình 8-15 bằng cách đảm bảo các giá trị cho
tầng và phòng ngủ nằm trong phạm vi trước khi sử dụng chúng làm chỉ số phụ mảng.)
Trang 32

Hình 8-15 Một chương trình xác định giá thuê (tiếp tục)
Trang 33

Hình 8-15 Một chương trình xác định giá thuê

Mảng hai chiều không bao giờ thực sự cần thiết để đạt được một chương trình hữu ích. Các
cùng 15 loại thông tin cho thuê có thể được lưu trữ trong ba chiều đơn lẻ riêng biệt
mỗi mảng gồm năm phần tử và bạn có thể sử dụng một quyết định để xác định mảng nào cần truy cập.
Tất nhiên, đừng quên rằng ngay cả các mảng một chiều cũng không bao giờ được yêu cầu để giải quyết
vấn đề. Bạn cũng có thể khai báo 15 biến tiền thuê riêng biệt và đưa ra 15 quyết định riêng biệt để
xác định giá thuê.
Trang 34

Bên cạnh mảng một và hai chiều, nhiều ngôn ngữ lập trình cũng hỗ trợ ba
mảng chiều . Ví dụ: nếu bạn sở hữu một tòa nhà chung cư nhiều tầng với
số lượng phòng ngủ có sẵn trong các căn hộ trên mỗi tầng, bạn có thể sử dụng
để lưu trữ phí thuê, nhưng nếu bạn sở hữu một số tòa nhà chung cư, bạn có thể muốn
sử dụng chiều thứ ba để lưu trữ số tòa nhà. Ví dụ: nếu một ba chiều
mảng được lưu trữ trên giấy, bạn có thể cần biết hàng, cột và trang của phần tử để
truy cập nó, như trong Hình 8-16.

Hình 8-16 Vẽ một mảng ba chiều

Nếu bạn khai báo một mảng ba chiều có tên RENTS_BY_3_FACTORS , thì bạn có thể sử dụng
biểu thức chẳng hạn như RENTS_BY_3_FACTORS [tầng] [phòng ngủ] [tòa nhà] , đề cập đến
con số tiền thuê cụ thể cho một căn hộ có số tầng và số phòng ngủ được lưu trong
các biến số tầng và phòng ngủ và số tòa nhà được lưu trữ trong biến số tòa nhà .
Cụ thể, RENTS_BY_3_FACTORS [0] [1] [2] đề cập đến một tầng hầm (tầng 0) một phòng ngủ
căn hộ ở tòa nhà 2 (là tòa nhà thứ 3).

Cả mảng hai và ba chiều đều là ví dụ về mảng nhiều chiều , là những mảng


có nhiều thứ nguyên. Một số ngôn ngữ cho phép nhiều thứ nguyên. Ví dụ, trong C # và Visual
Về cơ bản, một mảng có thể có 32 thứ nguyên. Tuy nhiên, mọi người thường khó theo dõi hơn
ba chiều.
Trang 35

HAI SỰ THẬT & MỘT LỜI NÓI DỐI


Sử dụng mảng đa chiều

1. Trong mọi mảng nhiều chiều, vị trí của bất kỳ phần tử nào phụ thuộc vào hai
các nhân tố.

2. Đối với mỗi phần tử trong mảng hai chiều, chỉ số con đầu tiên đại diện cho
số hàng và số thứ hai đại diện cho cột.

3. Mảng nhiều chiều không bao giờ thực sự được yêu cầu để đạt được một
chương trình.

Sử dụng tệp được lập chỉ mục và danh sách được liên kết
Sắp xếp danh sách năm hoặc thậm chí 100 điểm không yêu cầu tài nguyên máy tính đáng kể.
Tuy nhiên, nhiều tệp dữ liệu chứa hàng nghìn bản ghi và mỗi bản ghi có thể chứa
hàng chục trường dữ liệu. Việc sắp xếp số lượng lớn các bản ghi dữ liệu đòi hỏi thời gian đáng kể
và bộ nhớ máy tính. Khi một tệp dữ liệu lớn cần được xử lý theo hướng tăng dần hoặc
thứ tự giảm dần dựa trên một trường cụ thể, cách tiếp cận hiệu quả nhất thường là lưu trữ
và truy cập các bản ghi dựa trên thứ tự logic của chúng thay vì sắp xếp và truy cập chúng trong
trật tự vật lý của họ. Thứ tự vật chất đề cập đến một đơn đặt hàng "thực" để lưu trữ; một ví dụ sẽ là
viết tên của 10 người bạn, mỗi người vào một thẻ chỉ mục riêng. Bạn có thể sắp xếp các thẻ
theo thứ tự bảng chữ cái theo họ của bạn bè, theo thứ tự thời gian theo tuổi của tình bạn hoặc ngẫu nhiên
bằng cách ném các thẻ lên không trung và nhặt chúng khi bạn tìm thấy chúng. Cho dù bạn làm theo cách nào
nó, các bản ghi vẫn nối tiếp nhau theo một thứ tự nào đó. Ngoài thể chất hiện tại của họ
thứ tự, bạn có thể nghĩ về các thẻ như có một thứ tự hợp lý ; nghĩa là, một đơn đặt hàng ảo, dựa trên
bất kỳ tiêu chí nào bạn chọn — từ người bạn cao nhất đến người thấp nhất, từ người sống
xa nhất đến gần nhất, v.v. Việc sắp xếp các thẻ theo một thứ tự vật lý mới có thể mất rất nhiều thời gian
của thời gian; sử dụng các thẻ theo thứ tự hợp lý của chúng mà không sắp xếp lại về mặt vật lý chúng thường
hiệu quả hơn.

Sử dụng tệp được lập chỉ mục


Một phương pháp phổ biến để truy cập các bản ghi theo thứ tự logic yêu cầu sử dụng một chỉ mục. Sử dụng
một chỉ mục liên quan đến việc xác định một trường chính cho mỗi bản ghi. Trường khóa của bản ghi là trường
mà nội dung của nó làm cho bản ghi là duy nhất trong số tất cả các bản ghi trong một tệp. Ví dụ,
nhiều nhân viên có thể có cùng họ, tên, mức lương hoặc địa chỉ đường phố,
nhưng mỗi nhân viên sở hữu một số nhận dạng nhân viên duy nhất, vì vậy số ID
Trang 36

Sử dụng tệp được lập chỉ mục và danh sách được liên kết

trường có thể tạo ra một trường chính tốt cho một tệp nhân sự. Tương tự, một số sản phẩm làm cho
một trường khóa tốt trong tệp kiểm kê.

Vì các trang trong sách có số, bộ nhớ máy tính và vị trí lưu trữ có
các địa chỉ . Trong Chương 1, bạn đã biết rằng mọi biến đều có địa chỉ số trong
bộ nhớ máy tính; tương tự như vậy, mọi bản ghi dữ liệu trên đĩa đều có địa chỉ số nơi nó
được lưu trữ. Bạn có thể lưu trữ các bản ghi theo bất kỳ thứ tự vật lý nào trên đĩa, nhưng khi bạn lập chỉ mục
bản ghi, bạn lưu trữ danh sách các trường khóa được ghép nối với địa chỉ lưu trữ cho
bản ghi dữ liệu tương ứng. Sau đó, bạn có thể sử dụng chỉ mục để tìm các bản ghi theo thứ tự
dựa trên địa chỉ của họ.

Khi bạn sử dụng một chỉ mục, bạn có thể lưu trữ các bản ghi trên một thiết bị lưu trữ truy cập ngẫu nhiên , chẳng hạn như
đĩa, từ đó các bản ghi có thể được truy cập theo bất kỳ thứ tự nào. Mỗi bản ghi có thể được đặt trong bất kỳ
vị trí thực trên đĩa và bạn có thể sử dụng chỉ mục như cách bạn sử dụng chỉ mục ở phía sau
của một cuốn sách. Nếu bạn chọn một cuốn sách lịch sử Hoa Kỳ dày 600 trang vì bạn cần một số dữ kiện
về Betsy Ross, bạn không muốn bắt đầu từ trang 1 và làm việc theo cách của bạn qua cuốn sách.
Thay vào đó, bạn chuyển sang chỉ mục, khám phá rằng Betsy Ross được đề cập trên trang 418, và đi
trực tiếp đến trang đó. Là một lập trình viên, bạn không cần phải xác định chính xác bản ghi
địa chỉ thực để sử dụng nó. Hệ điều hành của máy tính đảm nhiệm việc định vị
lưu trữ có sẵn cho hồ sơ của bạn.

Chương 7 bao gồm thảo luận về các tệp truy cập ngẫu nhiên và chúng khác với các tệp tuần tự như thế nào.

Bạn có thể hình dung một chỉ mục dựa trên số ID bằng cách xem chỉ mục trong Hình 8-17. Các
chỉ mục được lưu trữ trên một phần của đĩa. Địa chỉ trong chỉ mục đề cập đến các
các vị trí trên đĩa.
Trang 37

Hình 8-17 Một chỉ mục trên đĩa liên kết số ID với địa chỉ đĩa

Khi bạn muốn truy cập dữ liệu của nhân viên 333, bạn yêu cầu máy tính của bạn xem qua
số ID trong chỉ mục, tìm một kết quả phù hợp, sau đó tiếp tục đến vị trí bộ nhớ
được chỉ định. Tương tự, khi bạn muốn xử lý hồ sơ theo thứ tự dựa trên số ID, bạn nói
hệ thống của bạn để truy xuất các bản ghi tại các vị trí trong chỉ mục theo trình tự. Như vậy, nhân viên 111
có thể đã được thuê cuối cùng và hồ sơ có thể được lưu trữ tại địa chỉ thực cao nhất trên
đĩa, nhưng nếu bản ghi nhân viên có số ID thấp nhất, nó sẽ được truy cập đầu tiên trong bất kỳ
đã đặt hàng xử lý.
Khi một bản ghi bị xóa khỏi một tệp được lập chỉ mục, nó không cần phải bị xóa về mặt vật lý. Nó là
tham chiếu chỉ có thể bị xóa khỏi chỉ mục và sau đó nó sẽ không còn là một phần của
Chế biến.

Sử dụng danh sách được liên kết


Một cách khác để truy cập các bản ghi theo thứ tự mong muốn, mặc dù chúng có thể không phải
được lưu trữ theo thứ tự đó, là tạo danh sách liên kết. Ở dạng đơn giản nhất, việc tạo một danh sách liên kết bao gồm
tạo thêm một trường trong mỗi bản ghi dữ liệu được lưu trữ. Trường bổ sung này giữ vật lý
Trang 38

địa chỉ của bản ghi lôgic tiếp theo. Ví dụ: một bản ghi chứa ID, tên của khách hàng,
và số điện thoại có thể chứa các trường sau:

idNum
Tên
Số điện thoại
nextCustAddress 359

Mỗi khi bạn sử dụng một bản ghi, bạn truy cập vào bản ghi tiếp theo dựa trên địa chỉ được giữ trong
trường nextCustAddress .
Mỗi khi bạn thêm một bản ghi mới vào danh sách được liên kết, bạn sẽ tìm kiếm chính xác trong danh sách
vị trí hợp lý của bản ghi mới. Ví dụ: giả sử rằng hồ sơ khách hàng được lưu trữ tại
các địa chỉ được hiển thị trong Bảng 8-3 và chúng được liên kết theo thứ tự ID khách hàng. Thông báo rằng
địa chỉ của các bản ghi không được hiển thị theo thứ tự tuần tự. Các bản ghi được hiển thị trong
thứ tự logic bởi idNum .

Bảng 8-3 Danh sách khách hàng được liên kết mẫu

Bạn có thể thấy từ Bảng 8-3 rằng mỗi bản ghi khách hàng chứa một trường nextCustAddress mà
lưu trữ địa chỉ của khách hàng tiếp theo theo thứ tự số ID khách hàng (và không
nhất thiết phải theo thứ tự địa chỉ). Đối với bất kỳ khách hàng cá nhân nào, địa chỉ của khách hàng hợp lý tiếp theo
có thể là xa về mặt vật lý.
Kiểm tra tệp được hiển thị trong Bảng 8-3 và giả sử rằng một khách hàng mới được
số 245 và tên Newberg. Cũng giả sử rằng hệ điều hành máy tính tìm thấy
một vị trí lưu trữ có sẵn cho dữ liệu của Newberg tại địa chỉ 8400. Trong trường hợp này, quy trình
thêm Newberg vào danh sách là:

1. Tạo một biến có tên là currentAddress để giữ địa chỉ của bản ghi trong danh sách
bạn đang kiểm tra. Lưu trữ địa chỉ của bản ghi đầu tiên trong danh sách, 0000, trong này
Biến đổi.
2. So sánh ID của khách hàng mới Newberg, 245, với ID của bản ghi (đầu tiên) hiện tại, 111
(nói cách khác, ID tại địa chỉ 0000). Giá trị 245 cao hơn 111, vì vậy bạn tiết kiệm
địa chỉ của khách hàng đầu tiên — 0000, địa chỉ mà bạn hiện đang kiểm tra — trong một
biến bạn có thể đặt tên saveAddress . Biến saveAddress luôn giữ địa chỉ
bạn vừa khám xong. Hồ sơ khách hàng đầu tiên chứa liên kết đến địa chỉ của
khách hàng hợp lý tiếp theo — 7200. Lưu trữ 7200 trong currentAddress biến.
Trang 39

3. Kiểm tra hồ sơ khách hàng thứ hai, hồ sơ tồn tại thực tế tại địa chỉ
7200, hiện được giữ trong biến currentAddress .
4. So sánh ID của Newberg, 245, với ID được lưu trữ trong hồ sơ tại Địa chỉ hiện tại ,
222. Giá trị 245 cao hơn, vì vậy hãy lưu địa chỉ hiện tại, 7200, trong saveAddress và
lưu trữ trường địa chỉ nextCustAddress , 4400, trong biến currentAddress .
5. So sánh ID của Newberg, 245, với 333, là ID tại Địa chỉ hiện tại (4400). Lên
cho đến thời điểm này, 245 đã cao hơn mỗi ID được kiểm tra, nhưng lần này giá trị 245 là
thấp hơn, do đó khách hàng 245 nên đứng trước khách hàng 333. Đặt
trường nextCustAddress trong bản ghi của Newberg (khách hàng 245) đến 4400, là
địa chỉ của khách hàng 333 và địa chỉ lưu trữ trong currentAddress . Điều này có nghĩa rằng
trong bất kỳ quá trình xử lý nào trong tương lai, bản ghi của Newberg về mặt logic sẽ được theo sau bởi bản ghi
chứa 333. Đồng thời đặt trường nextCustAddress của bản ghi nằm tại
saveAddress (7200,
khách hàng 222, Vincent, người đứng trước Newberg về mặt logic) vào
khách hàng mới Địa chỉ của Newberg, 8400. Danh sách cập nhật xuất hiện trong Bảng 8-4.

Bảng 8-4 Cập nhật danh sách khách hàng

Cũng như lập chỉ mục, khi xóa các bản ghi khỏi danh sách được liên kết, các bản ghi không cần phải
bị xóa vật lý khỏi phương tiện mà chúng được lưu trữ. Nếu bạn cần loại bỏ
khách hàng 333 từ danh sách trước, tất cả những gì bạn cần làm là thay đổi
trường nextCustAddress vào giá trị trong trường nextCustAddress của Silvers , là của Donovan
địa chỉ: 6000. Nói cách khác, giá trị 6000 có được không phải do biết bản ghi nào
Newberg nên chỉ ra, nhưng bằng cách biết Silvers đã chỉ ra hồ sơ nào trước đó. Khi nào
Kỷ lục của Newberg chỉ đến Donovan, kỷ lục của Silvers sau đó bị bỏ qua trong bất kỳ thời gian nào nữa
xử lý sử dụng các liên kết để di chuyển từ bản ghi này sang bản ghi tiếp theo.

Các danh sách được liên kết phức tạp hơn được liên kết kép — chúng lưu trữ hai trường bổ sung với mỗi
ghi lại. Một trường lưu địa chỉ của bản ghi tiếp theo và trường kia lưu địa chỉ
của bản ghi trước đó để danh sách có thể được truy cập tiến hoặc lùi.
Trang 40 HAI SỰ THẬT & MỘT LỜI NÓI DỐI
Sử dụng tệp được lập chỉ mục và danh sách được liên kết

1. Khi một tệp dữ liệu lớn cần được xử lý theo thứ tự dựa trên một trường cụ thể,
cách tiếp cận hiệu quả nhất thường là sắp xếp các bản ghi.

2. Trường khóa của bản ghi chứa một giá trị làm cho bản ghi là duy nhất trong số tất cả
hồ sơ trong một tệp.

3. Tạo danh sách liên kết yêu cầu bạn tạo thêm một trường cho mỗi bản ghi; điều này
trường bổ sung giữ địa chỉ vật lý của bản ghi lôgic tiếp theo.

Tóm tắt chương


Thông thường, các mục dữ liệu cần được sắp xếp. Khi bạn sắp xếp dữ liệu, bạn có thể sắp xếp theo
thứ tự tăng dần, sắp xếp các bản ghi từ giá trị thấp nhất đến cao nhất hoặc theo thứ tự giảm dần,
sắp xếp hồ sơ từ giá trị cao nhất đến thấp nhất.
Theo cách sắp xếp bong bóng, các mục trong danh sách được so sánh với nhau theo từng cặp. Khi một mặt hàng hết
của đơn đặt hàng, nó hoán đổi các giá trị với mục bên dưới nó. Với cách sắp xếp bong bóng tăng dần, sau mỗi
cặp mục liền kề trong danh sách đã được so sánh một lần, mục lớn nhất trong danh sách sẽ có
"Chìm" xuống đáy; sau nhiều lần đi qua danh sách, các mục nhỏ nhất vươn lên dẫn đầu.
Thuật toán sắp xếp bong bóng có thể được cải thiện để sắp xếp các số lượng giá trị khác nhau và
loại bỏ những so sánh không cần thiết.

Khi bạn sắp xếp các bản ghi, hai cách tiếp cận có thể là đặt các mục dữ liệu liên quan song song
mảng và để sắp xếp các bản ghi nói chung.
Khi bạn sử dụng sắp xếp chèn, bạn xem xét từng phần tử danh sách một. Nếu một phần tử
không đúng thứ tự so với bất kỳ mục nào trước đó trong danh sách, bạn di chuyển từng mục trước đó
xuống một vị trí và sau đó chèn phần tử đã thử nghiệm.
Mảng hai chiều có cả hàng và cột giá trị. Bạn phải sử dụng hai
chỉ số con khi bạn truy cập một phần tử trong mảng hai chiều. Nhiều ngôn ngữ
hỗ trợ các mảng với nhiều kích thước hơn.
Bạn có thể sử dụng chỉ mục hoặc danh sách được liên kết để truy cập các bản ghi dữ liệu theo một thứ tự logic khác nhau
từ trật tự vật lý của họ. Sử dụng một chỉ mục liên quan đến việc xác định một địa chỉ thực và khóa
trường cho mỗi bản ghi. Tạo một danh sách được liên kết bao gồm việc tạo một trường bổ sung trong mỗi
bản ghi để giữ địa chỉ vật lý của bản ghi lôgic tiếp theo.
Trang 41

Điều khoản quan trọng


Thứ tự tuần tự mô tả sự sắp xếp của các bản ghi khi chúng được lưu trữ lần lượt
khác trên cơ sở giá trị trong một trường cụ thể.

Các trung bình giá trị trong một danh sách là giá trị ở vị trí giữa khi các giá trị đều được sắp xếp; khi nào
danh sách chứa một số giá trị chẵn, giá trị trung bình là giá trị trung bình của hai giá trị
các vị trí ở giữa.

Các trung bình giá trị trong một danh sách là tỷ lệ trung bình số học.

Một loại bong bóng là một loại trong đó một danh sách các yếu tố được sắp xếp theo tăng dần hoặc
thứ tự giảm dần bằng cách so sánh các mặt hàng theo cặp; khi một mặt hàng không đúng thứ tự, nó sẽ được hoán đổi
với mục bên dưới nó.

Một loại chìm là một tên khác cho một loại bong bóng.

Một thuật toán là một danh sách các hướng dẫn thực hiện một nhiệm vụ.

Để giá trị trao đổi là để trao đổi các giá trị của hai biến.

Một loại chèn là một loại trong đó mỗi phần tử danh sách được kiểm tra cùng một lúc; nếu một phần tử là
không theo thứ tự so với bất kỳ mục nào trước đó trong danh sách, mỗi mục trước đó được chuyển xuống một
vị trí và sau đó phần tử được kiểm tra được chèn vào.

Một một chiều hoặc mảng đơn chiều là một danh sách truy cập sử dụng một subscript duy nhất.

Mảng hai chiều có cả hàng và cột giá trị; bạn phải sử dụng hai đăng ký
khi bạn truy cập một phần tử trong mảng hai chiều.

Ma trận và bảng là thuật ngữ được các nhà toán học sử dụng để mô tả một mảng hai chiều.

Mảng ba chiều là mảng trong đó mỗi phần tử được truy cập bằng cách sử dụng ba
bảng điểm.
Mảng nhiều chiều là danh sách có nhiều hơn một chiều.
Thứ tự vật lý của danh sách là thứ tự mà các phần tử của nó thực sự được lưu trữ.

Thứ tự logic của danh sách là thứ tự mà nó được sử dụng, mặc dù các phần tử của nó không
nhất thiết phải được lưu trữ theo thứ tự vật lý đó.

Trường khóa của bản ghi chứa một giá trị làm cho bản ghi là duy nhất trong số tất cả các bản ghi trong tệp.

Địa chỉ xác định bộ nhớ máy tính và vị trí lưu trữ.

Khi bạn lập chỉ mục các bản ghi, bạn lưu trữ một danh sách các trường khóa được ghép nối với địa chỉ lưu trữ cho
bản ghi dữ liệu tương ứng.

Một thiết bị lưu trữ truy cập ngẫu nhiên , chẳng hạn như một đĩa, là một trong những từ mà các hồ sơ có thể được truy cập
theo bất kỳ thứ tự nào.

Một danh sách được liên kết chứa một trường bổ sung trong mọi bản ghi dữ liệu được lưu trữ; trường bổ sung này chứa
địa chỉ vật lý của bản ghi logic tiếp theo.

You might also like