1. Trang chủ
  2. » Luận Văn - Báo Cáo

Báo cáo cài đặt và đánh giá hiệu năng bốn thuật toán sắp xếp (Bubble Sort, Interchange Sort, Selection Sort, Insertion Sort) có code C++

29 208 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 29
Dung lượng 1,1 MB
File đính kèm Chương trình C++.zip (511 KB)

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Trong hầu hết các hệ lưu trữ, quản lý dữ liệu hiện nay, thao tác tìm kiếm và sắp xếpthường được sử dụng rất nhiều để khai thác thông tin một cách nhanh chống và hiệu quả.(Ví dụ: Quản lý điểm học sinh, tra cứu sách thư viện…) và muốn quá trình tìm kiếm đượcdiễn ra nhanh chống thì dữ liệu cần phải được sắp xếp gọn gàng theo một trật tự nhấtđịnh. Để làm được việc đó, ta cần phải cân nhắc sử dụng đến các thuật toán sắp xếp đểquá trình đó được thực hiện hiệu quả và nhanh chống nhất.Hiện nay, đã có nhiều giải thuật tìm kiếm và sắp xếp được xây dựng, mức độ hiệu quảcủa từng giải thuật còn phụ thuộc và tính chất của cấu trúc dữ liệu cụ thể mà nó tác độngđến. Cho nên, ta nên lựa chọn các phương pháp sắp xếp sao cho phù hợp. Trong khoa họcmáy tính và trong toán học, một thuật toán sắp xếp là một thuật toán sắp xếp các phần tửcần sắp xếp là các số. Hầu hết các bài toán đều có nhiều cách khác nhau để giải quyếtchúng.Nội dung được trình bài trong đồ án này là những thuật toán sắp xếp thông dụng nhấtmức độ phức tạp ở mức tương đối và dễ dàng cài đặt. Đó là các thuật toán sắp xếp như:Thuật toán sắp xếp nổi bọt (Bubble Sort), thuật toán đổi chổ trực tiếp (Interchange Sort),thuật toán chọn trực tiếp (Selection Sort), thuật toán chèn trực tiếp (Insertion Sort). Ngoàira, còn trên dưới hơn một chục thuật toán khác nữa, nhưng trong chủ đề này chỉ tìm hiểu,cài đặt và đánh giá hiệu năng bốn thuật toán trên.

Trang 1

TRƯỜNG ĐẠI HỌC ĐỒNG THÁP

KHOA KỸ THUẬT - CÔNG NGHỆ

0018413051 - DƯƠNG TẤN THÀNH

ĐỒ ÁN MÔN HỌC 1

CÀI ĐẶT BỐN GIẢI THUẬT SẮP XẾP VÀ ĐÁNH GIÁ HIỆU NĂNG

Mã số quyển báo cáo:

NGÀNH: KHOA HỌC MÁY TÍNH LỚP: DHCNTT18

Trang 2

TRƯỜNG ĐẠI HỌC ĐỒNG THÁP

KHOA KỸ THUẬT - CÔNG NGHỆ

0018413051 - DƯƠNG TẤN THÀNH

ĐỒ ÁN MÔN HỌC 1

CÀI ĐẶT BỐN GIẢI THUẬT SẮP XẾP VÀ ĐÁNH GIÁ HIỆU NĂNG

Mã số quyển báo cáo:

NGÀNH: KHOA HỌC MÁY TÍNH LỚP: DHCNTT18

Giảng viên hướng dẫn: Thạc sĩ Nguyễn Thị Mỹ Dung

Trang 3

LỜI DẪN

Trong hầu hết các hệ lưu trữ, quản lý dữ liệu hiện nay, thao tác tìm kiếm và sắp xếpthường được sử dụng rất nhiều để khai thác thông tin một cách nhanh chống và hiệu quả.(Ví dụ: Quản lý điểm học sinh, tra cứu sách thư viện…) và muốn quá trình tìm kiếm đượcdiễn ra nhanh chống thì dữ liệu cần phải được sắp xếp gọn gàng theo một trật tự nhấtđịnh Để làm được việc đó, ta cần phải cân nhắc sử dụng đến các thuật toán sắp xếp đểquá trình đó được thực hiện hiệu quả và nhanh chống nhất

Hiện nay, đã có nhiều giải thuật tìm kiếm và sắp xếp được xây dựng, mức độ hiệu quảcủa từng giải thuật còn phụ thuộc và tính chất của cấu trúc dữ liệu cụ thể mà nó tác độngđến Cho nên, ta nên lựa chọn các phương pháp sắp xếp sao cho phù hợp Trong khoa họcmáy tính và trong toán học, một thuật toán sắp xếp là một thuật toán sắp xếp các phần tửcần sắp xếp là các số Hầu hết các bài toán đều có nhiều cách khác nhau để giải quyếtchúng

Nội dung được trình bài trong đồ án này là những thuật toán sắp xếp thông dụng nhấtmức độ phức tạp ở mức tương đối và dễ dàng cài đặt Đó là các thuật toán sắp xếp như:Thuật toán sắp xếp nổi bọt (Bubble Sort), thuật toán đổi chổ trực tiếp (Interchange Sort),thuật toán chọn trực tiếp (Selection Sort), thuật toán chèn trực tiếp (Insertion Sort) Ngoài

ra, còn trên dưới hơn một chục thuật toán khác nữa, nhưng trong chủ đề này chỉ tìm hiểu,cài đặt và đánh giá hiệu năng bốn thuật toán trên

Trang 4

DANH MỤC HÌNH ẢNH

DANH MỤC BẢNG

MỤC LỤC

Trang 5

Và giải pháp là ta sẽ ứng dụng các thuật toán sắp xếp một cách hiệu quả nhất Có khánhiều thuật toán sắp xếp, mỗi một thuật toán đều có ưu và nhược điểm nhất định, việcquan trọng là ta phải hiểu biết chuyên sâu từng thuật toán và biết cách áp dụng vào thực tếkhi xây dựng bất kì một hệ quản trị cơ sở dữ liệu nào.

Qua đó, em đã chọn đề tài : Cài đặt bốn giải thuật sắp xếp và đánh giá hiệu năng đểtìm hiểu rõ hơn về những thuật toán sắp xếp như thuật toán sắp xếp nổi bọt (Bubble Sort),thuật toán đổi chổ trực tiếp (Interchange Sort), thuật toán chọn trực tiếp (Selection Sort),thuật toán chèn trực tiếp (Insertion Sort)

2 Mục tiêu

Tìm hiểu, cài đặt và đánh giá hiệu năng bốn thuật toán sắp xếp: Thuật toán sắp xếpnổi bọt (Bubble Sort), thuật toán đổi chổ trực tiếp (Interchange Sort), thuật toán chọn trựctiếp (Selection Sort), thuật toán chèn trực tiếp (Insertion Sort) trên ngôn ngữ lập trình C++với trình biên dịch Visual Studio 2019 Nhằm thực hiện việc sắp xếp các số nguyên hoặccác số thực theo thứ tự tăng dần hoặc giảm dần và xuất ra và đồng thời so sánh thời gianthực hiện của từng thuật toán, có thể nhập và xuất ra file để lưu lại kết quả thực hiện Ápdụng linh hoạt các kiểu lập trình như lập trình hướng cấu trúc và lập trình hướng đốitượng

3 Phạm vi nghiên cứu

Tìm hiểu và vận dụng xây dựng chương trình dựa trên các lý thuyết cơ bản về cácthuật toán sắp xếp như: thuật toán sắp xếp nổi bọt (Bubble Sort), thuật toán đổi chổ trựctiếp (Interchange Sort), thuật toán chọn trực tiếp (Selection Sort), thuật toán chèn trực tiếp(Insertion Sort)

Trang 6

4 Phương pháp nghiên cứu

+ Nghiên cứu tài liệu

+ Phân tích giải thuật

+ Tìm hiểu giải thuật

+ Phân tích độ phức tạp của thuật toán

+ Nghiên cứu thực nghiệm

+ Tổng hợp tài liệu

5 Kế hoạch thực hiện đề tài

Bảng 1 Kế hoạch thực hiện đề tài

Thời gian

(từ ngày …

Đến ngày …)

Công việc thựchiện

Người thực hiện Đánh giá

công việc

Ghi chú

Nhận đề tài Dương Tấn Thành

Liên hệ giảng viên hướng dẫn

Dương Tấn Thành

Tìm hiểu và sưu tập tài liệu Dương Tấn Thành

Tiến hành viết chương trình Dương Tấn Thành

Hoàn thành chương trình

Dương Tấn ThànhHoàn thành

viết báo cáo Dương Tấn Thành

Trang 7

PHẦN II: NỘI DUNG

CHƯƠNG 1 CƠ SỞ LÝ THUYẾT

-oOo -1 Một số lý thuyết ứng dụng trong việc xây dựng demo

a) Giới thiệu thuật toán sắp xếp

Sắp xếp là một quá trình biến đổi một danh sách các đối tượng thành một danh sáchthoải mãn một thứ tự xác định nào đó Sắp xếp đóng vai trò quan trọng trong tìm kiếm dữliệu Chẵng hạn, nếu danh sách đã được sắp xếp theo thứ tự tăng dần (hoặc giảm dần), ta

có thể sử dụng kỹ thuật tìm kiếm nhị phân hiệu quả hơn nhiều tìm kiếm tuần tự… Trongthiết kế thuật toán, ta cũng thường xuyên cần đến sắp xếp, nhiều thuật toán được thiết kếdựa trên ý tưởng xử lý các đối tượng theo một trật tự xác định

Các thuật toán sắp xếp được chia thành hai loại: sắp xếp trong và sắp xếp ngoài Sắpxếp trong được thực hiện khi mà các đối tượng cần sắp xếp được lưu ở bộ nhớ trong củamáy tính dưới dạng mảng, do đó sắp xếp trong còn được gọi là sắp xếp mảng Khi các đốitượng cần sắp xếp quá lớn ta cần lưu ở bộ nhớ dưới dạng file, ta cần sử dụng các phươngpháp sắp xếp ngoài, hay còn gọi là sắp xếp file Trong chương trình này ta sẽ trình bày cácthuật toán sắp xếp đơn giản, các thuật toán này đòi hỏi thời gian O (n2) để sắp xếp mảng

n đối tượng

Mảng cần được sắp xếp có thể là mảng số nguyên, mảng số thực, hoặc mảng các xâu

ký tự Trong trường hợp tổng quát, các đối tượng cần được sắp xếp có chứa một số thànhphần dữ liệu nào đó Thành phần dữ liệu đó còn được gọi là các khóa sắp xếp Chẳng hạn,

ta có một mảng các đối tượng sinh viên, mỗi sinh viên gồm các thành phần dữ liệu: tên,tuổi, chiều cao và ta muốn sắp xếp cho các sinh viên theo thứ tự chiều cao tăng Khi đó,chiều cao là khóa sắp xếp

Từ đây về sau, ta giả thuyết rằng, mảng cần được sắp xếp là mảng các dữ liệu người

dùng tự định nghĩa có tên KieuThuatToan với cấu trúc như sau:

typedef struct {

float ThoiGianThucThi;

float Temp;

Trang 8

Bloodshed Dev C++ là một môi trường phát triển tích hợp IDE có hỗ trợ đầy đủ tính năngcho ngôn ngữ lập trình C++ Nó sử dụng trình MinGW của GCC (Bộ trình dịch GNU)làm trình biên dịch Dev C++ cũng có thể được dùng kết hợp với Cygwin hay bất kỳ trìnhdịch nền nảng GCC nào khác.

Chương trình cho người dùng có cảm nhận hơi giống với hình thức của chương trìnhMicrosoft Visual Studio vốn được sử dụng rộng rãi hơn Dev có một đặc điểm phụ đó là

sử dụng DevPaks, là một phần gồm các gói mở rộng so với môi trường tiêu chuẩn, baogồm các thư viện, mẫu và các tiện ích chưa được thêm vào DevPaks thường có, nhưngkhông nhất định, tiện ích GUI (giao diện người dùng đồ họa), bao gồm các công cụ phổbiến như GTK+, wxWidgets và FLTK Có những DevPaks có chứa các thư viện với thậmchí nhiều hàm chức năng cao hơn

Dev C++ nói chung là một chương trình chỉ chạy trên windows Tuy nhiên, cũng cómột phiên bản cho Linux, nhưng vẫn trong giai đoạn alpha và chưa được cập nhật tronghơn 6 năm qua

Trang 9

Hình 1 Giao diện Dev C++

Hướng dẫn sử dụng Dev C++

Bước 1: Downloand phiên bản mới nhất của Bloodshed Dev C++ tại đường dẫn

https://sourceforge.net/projects/orwelldevcpp/

Trang 10

Hình 2 Đường dẫn tải Dev C++

Bước 2: Sau khi cài đặt ứng dụng, khởi động phần mềm lên bằng cách click chuột vào

biểu tượng icon của Bloodshed Dev C++ ngoài Desktop (Khi cài đặt chọn Desktop)

Bước 3: Để tạo một file mới bạn nhấn Ctrl + N hoặc File / New / Source File

Hình 3 Tạo File mới

Bước 5: Để tùy chỉnh trình soạn thảo vào Tools > Editor Options

Hình 4 Tùy chọn

Trang 11

Bước 6: Thực hiện viết đoạn code vào trình soạn thảo Bloodshed Dev C++

Hình 5 Viết Code vào trình soạn thảo

Bước 7: Để biên dịch nhấn F9, chương trình sẽ biên dịch nhanh chóng, nếu có lỗi sẽ được

hiển thị ở phía dưới cho bạn biết và sửa

Trang 12

Hình 6 Biên dịch chương trình

Bước 8: Để thực thi, bạn nhấn F10 Khi đó xuất hiện cửa sổ chạy thực hiện tính toán trên

đoạn code bạn đã viết

Trang 13

CHƯƠNG 2 XÂY DỰNG CHƯƠNG TRÌNH

1 Tổng quan về thuật toán

Một trong những vấn đề nền tảng của khoa học máy tính là sắp xếp một tập các phần

tử cho trước theo thứ tự nào đó Có rất nhiều các giải pháp cho vấn đề này, được biết đếnnhư là các thuật toán sắp xếp Bên cạnh các thuật toán sắp xếp đơn giản và rõ ràng thuậttoán sắp xếp nổi bọt (bubble sort) Một số khác, như phương pháp sắp xếp nhanh (quicksort) thù lại rất phức tạp nhưng đổi lại có kết quả thực thi nhanh hơn một cách đáng kể

Những thuật toán sắp xếp quen thuộc này có thể được chia thành hai nhóm dựa theo

độ phức tạp của chúng Độ phức tạp của thuật toán (Alorithmic complexity) là một chủ đềkhá rắc rối đòi hỏi sự tưởng tượng mà sẽ tốn thời gian để giải thích, nhưng ở đây có thểhiểu thông qua mối tương quan trực tiếp giữa độ phức tạp của thuật toán và hiệu quả của

nó Độ phức tạp của thuật toán thường được ký hiệu bởi một hàm O, trong đó O biểu diễn

độ phức tạp của thuật toán đi kèm với một giá trị n biểu diễn kích thước của số lần chạytối đa mà thuật toán đó dựa vào để xử lý trên dữ liệu

Ví dụ, O(n) có nghĩa là thuật toán có độ phức tạp tuyến tính Cụ thể hơn, nó sẽ mấtthời gian gấp 10 lần cho việc xử lý trên tập dữ liệu có 100 phần tử so với tập chỉ có 10phần tử (10 * 10 = 100) Nếu độ phức tạp là O(n2), thì nó sẽ phải tiêu tốn thời gian gấp

100 lần để xử lý trên tập 100 phần tử so với tập dữ liệu chỉ gồm 10 phần tử

Bên cạnh độ phức tạp của thuật toán, tốc độ của các thuật toán sắp xếp có thể được sosánh dựa vào kinh nghiệm có được từ việc thử trên các tập dữ liệu Vì tốc độ sắp xếp cóthể thay đổi rất nhiều tùy theo đặc điểm của dữ liệu, nên để các kết quả thống kê chínhxác dựa trên kinh nghiệm đòi hỏi việc chạy các thuật toán nhiều lần trên các dữ liệu khácnhau và tính trung bình Thông thường tập dữ liệu kiểm tra được tạo ngẫu nhiên

Trong các biểu đồ thể hiện mức độ hiệu quả của thuật toán dưới đây, đường thấp nhất

là “tốt nhất” Ghi nhớ rằng tốt nhất ở đây là một khái niệm không tuyệt đối vì nó còn tùythuộc vào trường hợp sử dụng của bạn – nếu nhìn biểu đồ bạn sẽ thấy quick sort có lẽ làthuật toán nhanh nhất, nhưng nếu sử dụng nó để sắp xếp các phần tử nhỏ lẻ khoảng 20 –

30 thì thật sự không hợp lý bởi độ phức tạp của nó, trong khi ta có thể sử dụng các thuậttoán đơn giản hơn và hiệu quả là như nhau

Trang 14

Hình 7 Đồ thị so sánh tốc độ xử lý của các thuật toán sắp xếp đơn

Đồ thị thị trên đã thể hiện khá rõ, Bubble sort là giải pháp cực kì không hiệu quả, vàshell sort là sự cải tiến tạo ra cuộc bứt phá hết sức ngoạn mục Chú ý rằng vào đườngngang đầu tiên của khu vực đồ thị thể hiện thời gian 100 giây- bạn sẽ thấy rằng không cóthuật toán nào trong số này mà bạn muốn sử dụng cho tập dữ liệu lớn của một ứng dụngtương tác Ngay cả khi dùng shell sort, người sử dụng cũng có nguy cơ ngồi bấm móngtay nếu bạn cố gắng sắp xếp nhiều hơn 10,000 phần tử

Nhìn từ phương diện tươi sáng hơn, tất cả những thuật toán thuộc nhóm O(n2) đềuđơn giản một cách không ngờ (có thể shell sort là một ngoại lệ hơi phức tạp hơn) Vớinhững chương trình dùng kiểm tra nhanh, những mẩu thử nghiệm gấp, hay các phần mềmdành cho người sử dụng nội bộ, chúng không phải là những lựa chọn tồi nếu bạn khôngđặt quá nặng về hiệu năng

Trang 15

Hình 8 Đồ thị so sánh tốc độ xử lý của các thuật toán sắp xếp phức tạp

Trong trường hợp tốc độ là ưu tiên hàng đầu, những giải thuật thuộc nhóm O(n log n)nên được sử dụng Chú ý rằng thời gian trong đồ thị ngay trên đây được đo theo từngphần 10 của giây thay vì từng trăm giây như đồ thị của nhóm O(n2)

Tuy nhiên mọi thứ thì không thật sự dễ dàng với các ứng dụng thực tiễn, bạn phảiđứng trước sự lựa chọn cân bằng (trade-offs) giữa các yếu tố Những thuật toán thuộcnhóm O(n log n) thì rất nhanh, nhưng tốc độ đó có được do phải trả giá cho sự phức tạptrong triển khai Trong trường hợp đệ quy, các cấu trúc dữ liệu nâng cao, mảng đa chiều -việc sử dụng những thuật toán này sẽ tạo ra nhiều vấn đề phát sinh rất khó chịu

Trang 16

1 Các giải thuật

a Giải thuật sắp xếp nổi bọt Bubble Sort

Sắp xếp nổi bọt (bubble sort): là một thuật toán sắp xếp đơn giản, với thao tác cơ bản

là so sánh hai phần tử kề nhau, nếu chúng chưa đứng đúng thứ tự thì đổi chỗ (swap) Có

thể tiến hành từ trên xuống (bên trái sang) hoặc từ dưới lên (bên phải sang) Nó còn có tên

là sắp xếp bằng so sánh trực tiếp Nó sử dụng phép so sánh các phần tử nên là một giải

Bước 1: xét các phần tử a[j] (j từ n-1 đến 1), nếu khóa của a[j] nhỏ hơn khóa của a[j-1] thì

hoán vị a[j] và a[j-1] Sau bước này thì a[0] có khóa nhỏ nhất

Bước 2: xét các phần tử a[j] (j từ n-1 đến 2) nếu khóa của a[j] nhỏ hơn khóa của a[j-1] thì

hoán vị a[j] và a[j-1] Sau bước này thì a[1] có khóa nhỏ nhất thứ 2

Sau n-1 bước thì dừng lại

Code trong chương trình C++:

void BubbleSort() {

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

for (int j = n - 1; j > i; j ) {

if (a[j] < a[j - 1]) {sawp(a[j], a[j - 1]);

}

Trang 17

}

}

c) Giải thuật đổi chỗ trực tiếp Interchange Sort

Như đã biế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à triệttiêu dần chúng đi Ý tưởng chính của giải thuật là xuất phát từ đầu dãy, tìm tất cả nghịchthế 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ử kế tiếp theo trong dãy

Ngôn ngữ mã giả:

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

Bước 2: j = i+1; // Tìm tất cả các phần tử a[j]<a[i], với j>i

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

Nếu a[j]<a[i] //xét cặp a[i], a[j]

a[j] = a[i];

a[i] = tg;

}

Trang 18

}

}

d) Giải thuật sắp sếp lựa chọn Selection Sort

Giải thuật sắp xếp chọn (Selection Sort) là một giải thuật đơn giản Giải thuật sắp xếpnày là một giải thuật dựa trên việc so sánh in-place, trong đó danh sách được chia thànhhai phần, phần được sắp xếp (sorted list) ở bên trái và phần chưa được sắp xếp (unsortedlist) ở bên phải Ban đầu, phần được sắp xếp là trống và phần chưa được sắp xếp là toàn

bộ danh sách ban đầu Phần tử nhỏ nhất được lựa chọn từ mảng chưa được sắp xếp vàđược tráo đổi với phần bên trái nhất và phần tử đó trở thành phần tử của mảng được sắpxếp Tiến trình này tiếp tục cho tới khi toàn bộ từng phần tử trong mảng chưa được sắpxếp đều được di chuyển sang mảng đã được sắp xếp

Giải thuật này không phù hợp với tập dữ liệu lớn khi mà độ phức tạp trường hợp xấunhất và trường hợp trung bình là O(n2) với n là số phần tử

Sau n-1 bước này thì mảng đã được sắp xếp

Code trong chương trình C++:

Trang 19

min_idx = j;

sawp(a[min_idx], a[i]);

}

}

e) Giải thuật sắp xếp chèn Insertion Sort

Thuật toán sắp xếp chèn thực hiện sắp xếp dãy số theo cách duyệt từng phần tử vàchèn từng phần tử đó vào đúng vị trí trong mảng con (dãy số từ đầu đến phần tử phíatrước nó) đã sắp xếp sao cho dãy số trong mảng sắp đã xếp đó vẫn đảm bảo tính chất củamột dãy số tăng dần

Giải thuật này coi như được chia làm hai phần Phần đầu là các phần tử đã được sắpxếp Từ phần tử tiếp theo, chèn nó vào vị trí thích hợp tại nữa đã sắp sao cho nó vẫn đượcsắp xếp

Ngôn ngữ mã giả:

Xem phần tử a[0] là một dãy đã có thứ tự

Bước 1: xen a[1] vào danh sách đã có thứ tự a[0] sao cho a[0], a[1] là danh sách đã có thứtự

Bước 2: xen a[2] vào danh sách đã có thứ tự a[0], a[1] sao cho a[0], a[1], a[2] là danhsách đã có thứ tự

Tổng quát bước 1, xen a[i] vào danh sách đã có thứ tự a[0], a[1],…a[i-1] sao cho a[0],a[1],…a[i] là danh sách đã có thứ tự Sau n-1 bước thì kết thúc

Code trong chương trình C++:

pos = i - 1; //tim vi tri chen key

while ((pos >= 0) && (a[pos] > key {

Ngày đăng: 09/11/2020, 13:48

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w