Một số phương pháp tìm kiếm và sắp xếp phổ biến là: HH 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% tt 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
EHUTECH 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Í
NGHIỆP LẮP RÁP XE HƠI
Sinh viên thực hiện: Trần Minh Lập
Lớp : 22TXTHOI
Khoá : 2022
Giảng viên hướng dẫn : ThS Ngô Tân Khai
TP H 6Chi Minh, thang Ø7 năm 2023
Trang 2
TRƯỞNG ĐẠI HỌC CÔNG NGHỆ TP HCM
BỘ GIÁO DỤC VÀ ĐÀO TẠO
EHUTECH HUTECH
Đại học Công nghệ Tp.HOM 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Í
NGHIỆP LẮP RÁP XE HƠI
Sinh viên thực hiện: Trần Minh Lập
Lớp : 22TXTHOI
Khoá : 2022
Giảng viên hướng dẫn : ThS Ngô Tân Khai
TP H 6Chi Minh, thang Ø7 năm 2023
Trang 31.2.3 Sấp xếp chọn (Selection SOrf): 5: Stccs+tsrexerrrererrrrrersrrrree 5
1.2.4 Sấp xếp chèn (Insertion SOrf): - ¿- + tt +t‡rt+trkerererkrrerrrkrrrrrrrrree 7
1.2.5 Sấp xếp nổi bọt (Bubble Sort): : ¿+ +c+St+t+xsrrskrsrrrtrtsrrrrrrree 8 1.2.6 Sắp xếp nhanh (Quick SOrf): -¿- 56-22 2E +E+ESE+EvE+eEtetrtrvererererrsre 9
1.2.7 Sắp xếp vun đống (Heap SOrt): - + c5 St+t+tsrrtrrtrrrrrrrrrrrree 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 chỉ âi: 15 I0 is 0 ni 18
2 DANH SÁCH LIÊN KẾT ĐƠN set 23
"Nha nh 23
"2N ¡on 24 2.2.1 Thực hành trên danh sách liên kết đơn - «55555 s++5<*ssss++ssss+ 27 2.3 Minh hoa trén G6 tal .ằee 31
3 CAY NHI PHAN TIM KIEM wu eecseecsssscssseessseessneessneeesneeesenesnessnsesneenneeatennees 33
“An ha ha 33 3.2 The hath 34 3.3 Minh hoa trén DEtal cc cceecsssssssssssnscccceeeeceeeeeeeeeeeceeeeseesseeeseeeseesaaensaaeaaaeees 37
4 STACK VÀ QUEUE ¿©5252 S222 S223 121211152315 2111 211111101 e2 39
Trang 44.1 Lý thuyết ©2Sc ke SE EEE192111 11211171111 111711 0111111111111 1111 ke 39 A.2 Thur Banh ieeceeccccecccccccecseccccseescssececsuceccsececsuesscsucsucsucsnssesarsuesucsessessesaesesvaneaeeess 40
5 TONG HOP uceeecccsccccsecscscscecsececsucsesucsesucsesecsececsucarsucsesscsesassesarsnsataneatsesatevaneesere 42 TAI LIEU THAM KHAO ccccccsccscscsesccsesescssesceesscscsesccscsesessescsesseecsessucaescatsescacaeaceces 44
Trang 5MO DAU
Cấu trúc dữ liệu và giải thuật là một môn học cơ bản va quan trọng trong lĩnh vực Khoa học Máy tính và Công nghệ Thông tin Môn học này tập trung nghiên cứu
v`cách tổ chức và quản lý dữ liệu cũng như các phương pháp giải quyết các vấn đề
trong lập trình Cấu trúc dữ liệu là cách tôi tổ chức và lưu trữ dữ liệu trong máy tính sao cho hiệu quả và dễ dàng truy cập Trong khi đó, giải thuật là tập hợp các quy trình
và phương pháp để thực hiện một công việc cụ thể
Môn học này 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 dữ liệu, trong đó mỗi ph3n tử trong mảng 1 chi âI tương đương với một dòng (row) trong bảng
Mảng một chi`âi là một cấu trúc dữ 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 dữ liệu Sử dụng mảng 1 chi êâi để lưu trữ thông
tin bảng giúp tôi biểu diễn cấu trúc dữ liệu dễ dàng và hiệu quả, đ ồg 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 dữ 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 1 chi`âi để 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 dữ liệu sẽ được giả định đã được nắm vững từ trước
Trang |
Trang 61 TIM KIEM VA SAPXEP
Có nhi 'âi 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 tr, va yéu c 41 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à:
HH 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% tt
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 tử
O Tìm 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 loại bỏ nửa mảng không chứa ph tử c3n tìm Lặp lại 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)
Độ phức tạp thời gian trung bình là O(n2)
O 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`ä 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)
O Sap 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 ä 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 phi tử
Trang 2
Trang 71.2 Thực hành
Trong ph3n 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 tun 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à sấp xếp nổi bọt (bubble sort)
1.2.1 Tìm kiếm tuẦin ty (Linear Search):
Thuật toán tìm kiém tu% ty 1a phương pháp tìm kiếm đơn giản nhất Nó tìm kiếm một ph3n tử trong một mảng bằng cách duyệt từ đầi đến cuối mảng và so sánh
từng phẦn tử với giá trị c % tìm
Trong trường hợp tìm thấy phần tử, thuật toán trả v`ềvị trí đi 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ụ: -1)
O Ưu điểm: Đơn giản, dễ hiểu, có thể áp dụng cho mảng không được sắp xếp [1 Nhược điểm: Hiệu suất kém khi mảng lớn vì phải duyệt qua tất cả các ph ân tử
Vi du v €tim kiém tu% tự trong C++:
#include <iostream>
int linearSearch(int arr[], int n, int target) {
for (int 1 = 031 <n; i++) {
Trang 3
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 % va so sénh ph tử ở giữa với giá trị cn tìm
Nếu ph3n tử ở giữa bằng với giá trị c3 tìm, thuật toán trả v`ềvị trí cla ph % tr
đó 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 đi 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 tử nào để kiểm tra
1 Ư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
HH Nhược điển: Yêu ci mảng đã được sắp xếp, và phức tạp khi thực hiện trên mảng động
Ví dụ v êm kiếm nhị 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+ 1;
Trang 4
Trang 91.2.3 S&p xép chon (Selection Sort):
Sắp xếp chọn là một thuật toán sấp xếp đơn giản và 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 €vi tri dW 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
1 Ưu điểm: Don giản, dễ hiểu, dễ cài đặt
O 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 10/¡ Đổi chỗ phn 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 = 031 <n; i++) {
Trang 111.2.4 Sap xép chén (Insertion Sort):
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 đã g3 sắp xếp
Thuật toán này hoạt động bằng cách chèn một ph3n tử từ mảng chưa sắp xếp vào đúng vị trí trong mảng đã sắp xếp Đi`âi 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
1 Ưu điển: Hiệu suất tốt hơn trong trường hợp mảng g3 sấp xếp, dễ cài đặt
HH 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 7
Trang 121.2.5 Sấp xếp nổi bọt (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 k €trong mang 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
O Uu diém: Don giản, dễ cài đặt, hiệu suất tốt trong trưởng hợp mảng g3n sắp
xếp
O Nhược điểm: Hiệu suất kém hơn trong trường hợp mảng lớn vì phải thực hiện
nhi âi phép đổi chỗ
//¡ Đổi chỗ hai phần tử nếu không được sắp xếp
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
Trang 8
Trang 13std::cout << "Mang sau khi sap xep: ";
for (int 1 = 031 <n; i++) {
1.2.6 Sap xép nhanh (Quick Sort):
Sấp xếp nhanh là một thuật toán sắp xếp dựa trên ý tưởng của chia để trị, tức là
chia mang c% 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:
1 Chọn một phần tử làm phẦn tử chốt (pivot) trong mảng
O Phân vùng 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 ph3n tử lớn hơn phần tử chốt ở bên phải
1 Sắp xếp đệ quy hai phẦn trái và phải cho đến khi không thể chia nhỏ hơn được
HH Sắp xếp nhanh có một số ưu điểm và nhược điểm như sau:
Trang 14O 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 `âi ph3n 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
1 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 - 1;
for (int j = low; j < high; j++) {
// Néu ph% té hién tại nhỏ hơn hoặc bằng chốt
if (arr[j] <= pivot) {
i++; // Tang ¡ lên
swap(arrli], arr[jl);
Trang 10
Trang 15return i + 1; // Tra v chỉ số của chốt
void quickSort(int arr[], int low, int high) {
if (low < high) {
int pi = partition(arr, low, high);
quickSort(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 đống (Heap Sort):
Sắp 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 giá trị của các nút con, và giá trị lớn nhất nằm ở 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 giá trị 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:
O Vun mảng c3n sắp xếp thành một đống cực đại (hoặc cực tiểu)
Lay ph%® tử lớn nhất (hoặc nhỏ nhất) ở gốc của đống ra và đưa vào vị trí cuối
cting clla mang
1 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)
1 Lặp lại các bước trên cho đến khi mảng được sắp xếp hoàn toàn
HH 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 17O 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
O 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++:
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[i]);
heapify(arr, i, 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: ";
Tdi da tim hiéu v €cdc thuat todn tim kiém tu %n ty va tim kiếm nhị phân, cũng
như các thuật toán sắp xếp chọn, sắp xếp chèn và sắp xếp nổi bọt Tôi đã biết cách hoạt
động của mỗi thuật toán và có các ví dụ minh họa v`ềcách sử dụng chúng trong C++
Trang 14
Trang 19Để hiểu rõ hơn v`êcác thuật toán này va cách triển khai chúng trong C++, tdi cd thể tìm hiểu thông tin và tài liệu bổ sung từ các ngu ni tham khảo, sách giáo khoa v`ê cấu trúc dữ 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 chất của dữ liệu đầ vào Khi triển khai các thuật toán trong ứ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 mot chia
#include <iostream> using namespace std;
void printArray(int arr[], int n) {
int search(int arr[], int n, int x) {
for (int 1 = 031 <n; i++) {
void sort(int arr[], int n) {
for (int i= 1;i <n; i++) {
int key = arr[i];
Trang 21int n = sizeof(arr) / sizeof(arr[0]);
cout << " Mang ban d%u la: " << endl;
Chương trình này có các ph Ân sau:
H Phân khai báo thư viện: #include <iostteam> là lệnh để sử dụng thư viện iostream trong C++, thu vién này chứa các hàm nhập xuất dữ liệu như cin và cout using namespace std; la 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 chuẩn C++
Trang 17
Trang 22O Phầ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 tử nếu tìm thấy, hoặc trả v`ê-1 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 đầ Vào
1 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 đ`âi chạy Hàm này có các bước sau:
1 Khởi tạo một mảng số nguyên gần 8 ph3n tử là {5, 3, 7, 9, 2, 4, 6, 8} và lấy 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 phn tử
O Inra mảng ban đầi bằng cách gọi hàm printArray
O Tìm kiếm một ph3n tử trong mảng bằng cách gọi hàm search, ph3n tử c3 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 thấy, in
ra thông báo không tìm thấy
O Sp xép mang bang cach goi ham sort
O Inra mảng sau khi sắp xếp bằng cách gọi hàm printArray
1 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 phần
tử của mảng sẽ lưu trữ thông tin vì một phân xưởng g ồn các trưởng dữ liệu:
idPhanXuong, tenPhanXuong va tenQuanDoc
Tôi sẽ thực hiện tạo chương trình C++ để thêm, hiển thị, tìm kiếm và sắp xếp các phẦn tử trong mảng dữ 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`âi của đ tài
struct PhanXuong {
Trang 18
Trang 23void nhapThongTin(PhanXuong arr[], int& n) {
cout << "Nhap so luong phan xuong muon nhap: ";
cin >> n;
cin.ignore();
for (int 1 = 031 <n; i++) {
cout << "Nhap thong tin phan xuong thu "<<i+ 1 << endl;
cout << "Nhap idPhanXuong: ";
Trang 19