Một số phương pháp tìm kiếm và sắp xếp phô biến là: - _ Tìm kiếm tuyến tính: Tìm kiếm một phần tử bằng cách duyệt qua từng phần tử trong một mảng hoặc danh sách liên kết cho đến khi tìm
Trang 1
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ TP HCM
BỘ GIÁO DỤC VÀ ĐÀO TẠO
HUTECH HUTECH
Đại học Công nghệ Tp.HCM học Công nghệ Tp.HCM
TIỂU LUẬN CÁU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
PHẢN MÈM QUẢN LÝ KHO BÁN THÀNH PHẨM CỦA XÍ
Trang 2TRƯỜNG ĐẠI HỌC CÔNG NGHỆ TP HCM
BỘ GIÁO DỤC VÀ ĐÀO TẠO
EHUTECH Đại học Công nghệ Tp.HCM
TIỂU LUẬN CÁU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
PHẢN MÈM QUẢN LÝ KHO BÁN THÀNH PHẨM CỦA XÍ
Trang 3MỤC LỤC
\/1090 0 0 I
Mi 000 I N04 190325 2
12 Thực hành - 2c c n1 H1 H1 11111111151 11251 12511111111 kknnkknnn n1 1111116155111 sxx 3 1.2.1 Tìm kiếm tuần tự (Linear Search): + 5s 2s SE2111121111111111121 111112 3
1.2.2 Tìm kiếm nhị phân (Binary Search): + St 1 1211121212121 cre 4
1.2.3 Sắp xếp chọn (Selection Sort): -s- s2 t2 121 1211111111 1211 11 tre 5 1.2.4 Sắp xếp chèn (Insertion SOrt): -s 5 s11 111121111 1112101101211 te 7 1.2.5 Sắp xếp nỗi bọt (Bubble Sort): 5c 21 1EE121111211111111111 12111 rxe 8
1.2.6 Sắp xếp nhanh (Quiek SOF): - - 5 s2 1221211 1121111211111211 11 1e re 9
1.2.7 Sap xép vun déng (Heap Sort): 0.c.cccccccccccscseesessesessesessessesesseseseseeeseseeen 12 1.2.8 Thực hành tìm kiếm và sắp xếp trên mảng số nguyên một chiêu: 15
1.3 Minh hoa trén dé tai eccccceesssssessssessseneesssnessseeesseseneeseneseseneeeeees 18
2 DANH SÁCH LIÊN KẾT ĐƠN 52522 2222222211222 re 23 2.1 Lý thuyẾt Sc n S11 111 11 111 11 1n t1 n1 ng 1n rung 23
2.2 Thore hanhw i ccecccccesesesseteeettetstsseceseeeesesesesesseseessetttettttvanseeees 24 2.2.1 Thực hanh trén danh séch lién két don .cccccccccccccccccccecesescececevevscsessseeeceees 27
2.3 Minh hoa trén dé tai eccssecssseeessenessssnssssnessnueessnnesecsnseceeeeeeeeerees 31
3.1 Lý thuyẾt s n1 TH nh HH HH t1 2111 gu tường 33
3.2 Thực hành cececeeececseeenseccesccccecccsecessessseetttestttnttaseccsseceseeceeees 34
3.3 Minh họa trên để tài -22cc 222 22t 211122112112 37
Trang 4In" a
4.2 Thực hành iecccsesesesenseeettetstsssceseeceseecsesessesesseetttettttvanseeees
000309790804 (1n e‹/
Trang 5và phương pháp đề thực hiện một công việc cụ thé
Môn học nay không chỉ là nền tảng cho việc hiểu và xây dựng các ứng dụng phức tạp, mà còn cung cấp cho tôi cái nhìn sâu sắc về hiệu suất và hiệu quả của các giải pháp lập trình Băng cách tối ưu hóa cấu trúc dữ liệu và lựa chọn các giải thuật thích hợp, tôi có thê cải thiện tính tương tác, tốc độ xử lý và sử dụng tài nguyên máy tính một cách hiệu quả
Trong đề tài này, tôi sẽ tập trung vào việc sử dụng ngôn ngữ lập trình C++~ để xây dựng một chương trình có khả năng lưu trữ và quản lý thông tin của một bảng đữ liệu, trong đó mỗi phần tử trong mảng 1 chiều tương đương với một dòng (row) trong bảng
Mảng một chiều là một cấu trúc đữ liệu cơ bản trong lập trình, cho phép tôi lưu trữ một chuỗi các giá trị có cùng kiểu đữ liệu Sử đụng mảng 1 chiều đề lưu trữ thông tin bảng giúp tôi biếu diễn cấu trúc đữ liệu đễ dàng và hiệu quả, đồng thời cung cấp các tính năng cho việc tìm kiếm, thêm, xoá và sắp xếp đữ liệu một cách thuận tiện
Đề thực hiện được mục tiêu nảy, tôi sẽ tập trung vào việc xây dựng các chức năng quan trọng như: thêm dữ liệu mới vào bảng, tìm kiếm thông tin, xoá dữ liệu, và hiển thị toàn bộ bảng Đồng thời, tôi cũng sẽ xem xét và so sánh hiệu năng của các giải thuật để đảm bảo chương trình hoạt động một cách hiệu quả với số lượng lớn dữ liệu Trong bài báo cáo này, tôi sẽ tập trung vào phân cài đặt của chương trình và minh họa cách sử dụng mảng I chiều đề lưu trữ thông tin bảng Các khái niệm cơ bản
về ngôn ngữ lập trình C++ và cấu trúc đữ liệu sẽ được giả định đã được nắm vững từ trước
Trang |
Trang 61 TIM KIEM VA SAP XEP
1.1 Ly thuyét
Tìm kiếm và sắp xếp là hai hoạt động cơ bản và quan trọng trong xứ lý đữ liệu Tìm kiếm là quá trình tìm kiếm một phần tử có giá trị cho trước trong một tập hợp các phân tử Sắp xếp là quá trình sắp xếp các phần tử trong một tập hợp theo một thứ tự nhất định
Có nhiều cách đề thực hiện tìm kiếm và sắp xép, tủy thuộc vào cấu trúc dữ liệu được sử dụng, số lượng phân tử, và yêu cầu về hiệu năng Một số phương pháp tìm kiếm và sắp xếp phô biến là:
- _ Tìm kiếm tuyến tính: Tìm kiếm một phần tử bằng cách duyệt qua từng phần tử
trong một mảng hoặc danh sách liên kết cho đến khi tìm thấy hoặc hết tập hợp
Độ phức tạp thời gian trung bình là O(n), với n là số lượng phần tử
- Tim kiém nhị phân: Tìm kiếm một phần tử trong một mảng đã được sắp xếp bằng cách so sánh giá trị của phần tử với giá trị của phần tử ở giữa mảng, rồi
loại bỏ nửa mảng không chứa phần tir can tim Lap lai quá trình này cho đến khi
tìm thấy hoặc hết mảng Độ phức tạp thời gian trung bình là O(log n)
- _ Sắp xếp nỗi bọt: Sắp xếp một mảng băng cách so sánh lần lượt các cặp phần tử
liền kề và đổi chỗ nếu không đúng thứ tự Lặp lại quá trình này cho đến khi
không còn đôi chỗ nào nữa Độ phức tạp thời gian trung bình là O(n2), với n là
số lượng phần tử
- _ Sắp xếp chèn: Sắp xếp một mảng băng cách duyệt qua từng phân tử, rồi chèn nó vào vị trí thích hợp trong đoạn mảng đã được sắp xếp từ đầu đến vị trí hiện tại
Độ phức tạp thời gian trung bình là O(n2)
- _ Sắp xếp chọn: Sắp xếp một mảng bằng cách duyệt qua từng phần tử, rồi chọn ra phần tử nhỏ nhất (hoặc lớn nhất) trong đoạn mảng chưa được sắp xếp, và đôi chỗ nó với phần tử ở vị trí hiện tại Độ phức tạp thời gian trung bình là O(n2)
- Sắp xếp nhanh: Sắp xếp một mảng bằng cách chọn ra một phần tử làm chốt (pivot), rồi phân chia mảng thành hai đoạn, một đoạn chứa các phần tử nhỏ hơn hoặc bằng chốt, và một đoạn chứa các phần tử lớn hơn hoặc bằng chốt Sau đó,
áp dụng thuật toán sắp xếp nhanh cho hai đoạn này một cách đệ quy Độ phức tạp thời gian trung bình là O(n log n), với n là số lượng phần tử
Trang 2
Trang 712 Thực hành
Trong phần này, tôi sẽ tìm hiểu về các thuật toán tìm kiếm và sắp xếp cơ bản trong ngôn ngữ lập trình C++ Tôi sẽ giới thiệu về thuật toán tìm kiếm tuần tự (linear search) và tìm kiếm nhị phân (binary search), cũng như các thuật toán sắp xếp chọn (selection sort), sắp xếp chèn (insertion sort) và sap xép néi bot (bubble sort) 1.2.1 Tìm kiểm tuân tự (Limear Search):
Thuật toán tìm kiếm tuần tự là phương pháp tìm kiếm đơn giản nhất Nó tìm kiếm một phần tử trong một mảng băng cách duyệt từ đầu đến cuối mảng và so sánh
từng phần tử với giá trị cần tìm
Trong trường hợp tìm thấy phần tử, thuật toán trả về vị trí đầu tiên của phần tử
đó trong mảng Nếu không tìm thấy, thuật toán trả về một giá trị đại diện cho việc
không tìm thấy (ví dụ: -L)
- _ Ưu điểm: Đơn giản, dễ hiểu, có thé 4p đụng cho mảng không được sắp xếp
- _ Nhược điểm: Hiệu suất kém khi mảng lớn vì phải duyệt qua tat cả các phần tử
Ví dụ về tìm kiếm tuần tự trong C++:
#include <iostream>
int linearSearch(int arr[], int n, int target) {
for (int 1= 0; 1 <n; i++) {
Trang 81.2.2 Tìm kiếm nhị phân (Binary Search):
Thuật toán tìm kiếm nhị phân áp dụng cho mảng đã được sắp xếp
Phương pháp này giới hạn phạm vi tìm kiếm bằng cách chia mảng thành hai phần và so sánh phần tử ở giữa với giá trị cần tìm
Nếu phân tử ở giữa băng với giá trị cần tìm, thuật toán trả về vị trí của phần tử
đó Nếu phần tử ở giữa lớn hơn giá trị cần tìm, tiếp tục tìm kiếm trong nửa đầu tiên của mảng Ngược lại, tìm kiếm trong nửa thứ hai của mảng
Thuật toán này tiếp tục lặp lại quá trình chia mảng đến khi tìm thấy phần tử hoặc không còn phần tử nào đề kiểm tra
- _ Ưu điểm: Hiệu suất tốt hơn tìm kiếm tuần tự khi mảng lớn và đã được sắp xếp
- Nhược điểm: Yêu cầu mảng đã được sắp xếp, và phức tạp khi thực hiện trên mảng động
Vi du vé tim kiém nhi phan trong C++:
#include <iostream>
int binarySearch(int arr[], int low, int high, int target) {
while (low <= high) {
int mid = low + (high - low) / 2;
if (arr[mid] == target) {
return mid; // Tra vé vi tri néu tim thay
} else if (arr[mid] < target) { low = mid + |;
Trang 4
Trang 91.2.3 Sap xép chon (Selection Sort):
Sắp xếp chọn là một thuật toán sap xép don gian va dé hiéu
Thuật toán này hoạt động bằng cách tìm phần tử nhỏ nhất trong mảng và đưa nó
về vị trí đầu tiên Sau đó, tiếp tục tìm phần tử nhỏ nhất trong mảng con còn lại và đưa
nó tiếp tục vào vị trí thích hợp trong mảng con còn lại Quá trình này được lặp lại cho đến khi mảng được sắp xếp hoàn chỉnh
- _ Ưu điểm: Đơn giản, dé hiểu, dé cài đặt
- Nhược điểm: Hiệu suất chậm hơn trong trường hợp mảng lớn vì phải tìm kiếm phân tử nhỏ nhất trong mảng còn lại ở mỗi bước
Trang 5
Trang 10Vi du vé sap xép chon trong C++:
#include <iostream>
void selectionSort(int arr[], int n) {
for (int i=0;i<n- 1; i++) {
// Đỗi chỗ phần tử nhỏ nhất tìm được với phần tử ở vị trí ¡
int temp = arr[i];
std::cout << "Mang sau khi sap xep: ";
for (int 1= 0; 1 <n; i++) {
Trang 111.2.4 Sap xếp chèn (Insertion Sor):
Sắp xếp chèn là một thuật toán sắp xếp tương đối hiệu quả cho các mảng có kích thước nhỏ hoặc đã gần sắp xép
Thuật toán này hoạt động bằng cách chèn một phần tử từ mảng chưa sắp xếp vào đúng vị trí trong mảng đã sắp xếp Điều này được thực hiện bằng cách so sánh phần tử hiện tại với các phần tử liền trước nó trong mảng đã sắp xếp và đưa phần tử hiện tại vào vị trí thích hợp trong mảng đã sắp xếp
- _ Ưu điểm: Hiệu suất tốt hơn trong trường hợp mảng gần sắp xếp, dễ cài đặt
- Nhược điểm: Hiệu suất chậm hơn so với một số thuật toán sắp xếp hiệu quả hơn như sắp xếp nhanh hoặc sắp xếp gộp
Trang 121.2.5 Sap xép noi bot (Bubble Sort):
Sắp xếp nổi bọt là một thuật toán sắp xếp đơn giản nhưng hiệu quả cho các mảng nhỏ
Thuật toán này hoạt động bằng cách so sánh hai phần tử liền kề trong mảng và đổi chỗ chúng nếu chúng không được sắp xếp theo thứ tự Quá trình này được lặp lại cho đến khi mảng được sắp xếp hoàn chỉnh
- Ưu điểm: Đơn giản, đễ cài đặt, hiệu suất tốt trong trường hợp mảng gần sắp
void bubbleSort(int arr[], int n) {
for (inti =0;1<n- 1; i++) {
for (int j=0;j<n-1i-1;j+) {
if (arr[j] > arrlj + 1]) {
// Đôi chỗ hai phần tử nếu không được sắp xếp
int temp = arr[j];
Trang 13std::cout << "Mang sau khi sap xep: ";
for (int 1= 0; 1 <n; i++) {
1.2.6 Sắp xếp nhanh (Quick Sort):
Sắp xếp nhanh là một thuật toán sắp xếp đựa trên ý tưởng của chia để trị, tức là chia mảng cần sắp xếp thành các mảng con nhỏ hơn và sắp xếp riêng biệt từng mảng con đó Thuật toán sắp xếp nhanh có các bước chính như sau:
- Chon mét phan tử làm phần tử chốt (pivot) trong mang
- Phan ving mảng thành hai phần, sao cho các phần tử nhỏ hơn hoặc bằng phần
tử chốt ở bên trái, và các phần tử lớn hơn phần tử chốt ở bên phải
- _ Sắp xếp đệ quy hai phân trái và phải cho đến khi không thê chia nhỏ hơn được
- Sap xép nhanh có một số ưu điểm và nhược điểm như sau:
Trang 14- - Thuật toán thân thiện với bộ đệm, vì nó làm việc trên các phân đoạn nhỏ của mảng tại một thời điểm, giảm thiểu lỗi bộ nhớ cache
- _ Thuật toán có thể áp dụng cho nhiều loại đữ liệu khác nhau và có thê điều chỉnh cho các hàm so sánh tùy biến
Nhược điểm:
- _ Thuật toán có độ phức tạp thời gian xấu nhất là O(n^2), rất kém hiệu quả khi
sắp xếp các mảng đã được sắp xếp hoặc có nhiều phân tử trùng lặp
- Thuật toán không ôn định, có thê thay đổi thứ tự của các phần tử bằng nhau trong mảng
- _ Việc chọn phần tử chốt phù hợp khó khăn, có thê ảnh hưởng đến hiệu suất của thuật toán Nếu chọn ngẫu nhiên, có thê rơi vào các trường hợp đặc biệt
Ví dụ về thuât toán sắp xếp nhanh trong C++
Int partition(int arr[], int low, int high) {
int pivot = arr[high];
int i= low - l;
for (int j = low; j < high; j++) {
// Néu phan tử hiện tại nhỏ hơn hoặc bằng chốt
Trang 15
}
swap(arr[i + 1], arr[high]);
return i+ 1; // Tra vé chi sé cua chét
void quickSort(int arr[], int low, int high) {
if (low < high) {
int pi = partition(arr, low, high);
quickS ort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
void printArray(int arr[], int size) {
for (int 1 = 0; 1 < size; i++) {
int size = sizeof(arr) / sizeof(arr[0]);
cout << "Mang ban dau la: ";
Trang 161.2.7 Sắp xép vun dong (Heap Sort):
Sap xép vun đồng là một thuật toán sắp xếp dựa trên một cấu trúc dữ liệu được gọi là đồng nhị phân (binary heap), gọi đơn giản là đống Đống nhị phân là một cây nhị phân hoàn chỉnh, có tính chất là giá trị của mỗi nút không nhỏ hơn (hoặc không lớn hơn) giá trị của các nút con của nó Có hai loại đồng nhị phân là đống cực đại (max heap) và đồng cực tiêu (min heap) Trong đồng cực đại, giá trị của mỗi nút không nhỏ hơn gia tri của các nút con, và giá trị lớn nhât nam ở gốc của cây Trong đông cực tiêu, giá trị của mối nút không lớn hơn gia tri của các nút con, và giá trị nhỏ nhật nắm ở gôc của cây
Thuật toán sắp xếp vun đồng có các bước chính như sau:
Vun mảng cần sắp xếp thành một đống cực đại (hoặc cực tiêu)
Lấy phần tử lớn nhất (hoặc nhỏ nhất) ở gốc của đồng ra và đưa vao vi tri cudi cùng của mảng
Vun lại phần còn lại của mảng thành một đồng cực đại (hoặc cực tiểu) Lặp lại các bước trên cho đến khi mảng được sắp xếp hoàn toàn
Thuật toán sắp xêp vun đông có một sô ưu điểm và nhược điểm như sau:
Trang 17- _ Thuật toán không thân thiện với bộ đệm, vì nó làm việc trên toàn bộ mảng tại một thời điểm, có thế gây ra lỗi bộ nhớ cache
- - Thuật toán khó khăn trong việc tận dụng tính song song hóa, vỉ việc vun lại mảng phụ thuộc vào kêt quả của các bước trước
Đây là một ví dụ về thuật toán sắp xếp vun đồng trong C++:
int left =2 *i+1;
int right = 2 *i+ 2;
if (left < size && arr[left] > arr[largest]) {
heapify(arr, size, largest);
void heapSort(int arr[], int size) {
for (int 1= size /2 - 1;1>=0;1 ) {
heapify(arr, size, 1);
for (int 1 = size - 1; 1> 0; 1 ) {
Trang 13
Trang 18
swap(arr[0], arr[1]);
heapify(arr, 1, 0);
void printArray(int arr[], int size) {
for (int 1 = 0; 1 < size; i++) {
int size = sizeof(arr) / sizeof(arr[0]);
cout << "Mang ban dau la: ";
đề tìm kiếm và sắp xếp các mảng
Những thuật toán này là những cơ bản và thường được sử dụng trong lập trình, nhưng chúng cũng có những hạn chế về hiệu suất và hiệu quả khi xử lý các mảng lớn Nếu tôi muốn tìm hiểu thêm về các thuật toán tìm kiếm và sắp xếp nâng cao hơn, có thể nghiên cứu về sắp xếp nhanh (quick sort), sắp xếp gộp (merge sort), tìm kiếm nhị phân cải tiên, và các thuật toán tôi ưu hơn khác
Trang 14
Trang 19Đề hiểu rõ hơn về các thuật toán nảy và cách triển khai chúng trong C+>+, tôi có thể tìm hiểu thông tin và tài liệu bố sung từ các nguồn tham khảo, sách giáo khoa về cầu trúc đữ liệu và giải thuật, hoặc các tài liệu trực tuyến về lập trình
Lưu ý rằng hiệu suất của các thuật toán có thê thay đôi dựa trên ngữ cảnh và tính chat của dữ liệu đầu vào Khi triển khai các thuật toán tronø ứng dụng thực tế, hãy xem xét kỹ càng để chọn thuật toán phù hợp nhất cho bài toán cụ thế mà tôi đang giải
quyết
Trang 15
Trang 201.2.8 Thực hành tìm kiếm và sắp xếp trên mảng số nguyên một chiêu:
int search(int arr[], int n, int x) {
for (int 1= 0; 1 <n; i++) {
void sort(int arr[], int n) {
for (int i= 1;1<n; i++) {
int key = arr[i];
Trang 16
Trang 21int n = sizeof(arr) / sizeof(arr[0]);
cout <<" Mang ban dau la: " << endl;
Chương trình này có các phần sau:
- Phần khai báo thư viện: #include <iostream> là lệnh để sử dụng thư viện 10stream trong C++, thư viện này chứa các hàm nhập xuất dữ liệu như cin và cout using namespace std; là lệnh để sử dụng không gian tên std, không gian tên này chứa các hàm và biên của thư viện chuan C++
Trang L7
Trang 22Phần định nghĩa hàm: Chương trình này có ba hàm được định nghĩa là
printArray, search và sort Hàm printArray có chức năng in ra một mảng số nguyên theo định dạng [a, b, c, ] Hàm search có chức năng tìm kiếm một phần tử trong mảng số nguyên bằng thuật toán tìm kiếm tuần tự, hàm này trả về chỉ số của phần tử nếu tìm thấy, hoặc trả về -L nếu không tìm thấy Hàm sort có chức năng sắp xếp một mảng số nguyên theo thứ tự tăng dần bằng thuật toán sắp xếp chèn, hàm này không trả về giá trị mà chỉ thay đôi trực tiếp mảng đầu vảo
Phần hàm chính: Hàm main là hàm chính của chương trình, hàm này được gọi khi chương trình bắt đầu chạy Hàm này có các bước sau:
Khởi tạo một mang số nguyên gồm 8 phan tu là {5, 3, 7, 9, 2, 4, 6, 8} va lay
kích thước của mảng băng cách chia kích thước của toàn bộ mảng cho kích thước của một phần tử
In ra mảng ban đầu bằng cách gọi hàm printArray
Tìm kiếm một phần tử trong mảng bằng cách gọi hàm search, phần tử cần tìm là
7 Nếu tìm thấy, in ra chỉ số của phần tử đó trong mảng, nêu không tìm thay, in
ra thông báo không tìm thấy
Sắp xếp mảng bằng cách gọi hàm sort
In ra mảng sau khi sắp xếp bằng cách gọi hàm printArray
Kết thúc hàm và trả về giá trị 0
1.3 Minh họa trên đề tài
Đối với đề tài "Chương trình quản lý thông tin phân xưởng" trong đó mỗi phan
tử của mảng sẽ lưu trữ thông tin về một phân xưởng gồm các trường dữ liệu: idPhanXuong, tenPhanXuong va tenQuanDoc
Tôi sẽ thực hiện tao chuong trinh C++ dé thém, hién thi, tim kiém va sap xếp các phần tử trong mảng đữ liệu này Trong đó, tôi sẽ áp dụng các thuật toán tìm kiếm và sắp xếp đã học và thực hành trong phần 1.2 đề giải quyết các yêu cầu của đề tài
Trang 23void nhapThongTin(PhanXuong arr[], int& n) {
cout << "Nhap so luong phan xuong muon nhap: ";
cin >> n;
cin.ignore();
for (int 1= 0; 1 <n; i++) {
cout << "Nhap thong tin phan xuong thu "<<1+ 1 << endl;
cout << "Nhap idPhanXuong: ";
Đoạn code trên định nghĩa một cấu trúc có tên là PhanXuong, bao gồm ba thành
phần: idPhanXuong, tenPhanXuong, và tenQuanDoc Và một hàm có tên là nhapThongTin, nhận một mảng các đối tượng PhanXuong và một tham chiếu số nguyên làm tham sô Hàm này yêu câu người dùng nhập sô lượng các đôi tượng PhanXuong muốn nhập, và sau đó lặp qua mảng để lấy giá trị cho từng thành phần từ người dùng
Trang L9