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

báo cáo bài tập nhóm sắp xếp danh sách liên kết đôi bằng thuật toán quick sort

14 0 0
Tài liệu đã được kiểm tra trùng lặp

Đ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

Hình 1: Cấu trúc danh sách liên kết đôi...2Hình 2: Minh họa thuật toán Quick sort trong danh sách liên kết đơn...2Hình 3: Minh họa thuật toán Quick sort trong danh sách liên kết đôi...5D

Trang 1

HỌC VIỆN NGÂN HÀNG KHOA HỆ THỐNG THÔNG TIN QUẢN LÝ

-BÁO CÁO BÀI TẬP NHÓM

Đề tài: SẮP XẾP DANH SÁCH LIÊN KẾT ĐÔI BẰNG

THUẬT TOÁN QUICK SORT

Giảng viên hướng dẫn: Nguyễn Thanh Thụy

Trang 2

HỌC VIỆN NGÂN HÀNG KHOA HỆ THỐNG THÔNG TIN QUẢN LÝ

-BÁO CÁO BÀI TẬP NHÓM

Đề tài: SẮP XẾP DANH SÁCH LIÊN KẾT ĐÔI

BẰNG THUẬT TOÁN QUICK SORT

Danh sách thành viên

Họ và tênMã sinh viênMức độ đóng góp(%)

Chữ ký

1 Phan Thị Phương Anh 24A4043026 20%

3 Nguyễn Thị Thanh Thảo 24A4040492 20%

4 Phí Thị Thắm 24A4040379 20%

5 Trần Mai Anh 24A4043029 20%

Hà Nội, ngày 26 tháng 3 năm 2023

Trang 3

LỜI CAM ĐOAN

Nhóm em đã đọc và hiểu về các hành vi vi phạm sự trung thực trong học thuật.Nhóm em cam kết bằng danh dự cá nhân rằng bài tập lớn này do nhóm em tự thựchiện và không vi phạm yêu cầu về sự trung thực trong học thuật.

Hà Nội, ngày 26 tháng 3 năm 2023 Học viên

Trang 4

LỜI CẢM ƠN

Lời đầu tiên cho phép nhóm xin gửi lời cảm ơn chân thành nhất đến giảng viênNguyễn Thanh Thụy Trong quá trình học tập một môn Cấu trúc dữ liệu và Giải thuật,nhóm chúng em đã được thầy quan tâm và giúp đỡ tận tình Sau 6 tuần học thì chúngem đã tích lũy thêm được rất nhiều kiến thức để có thể có cái nhìn sâu sắc và hoànthiện hơn về bộ môn này Thông qua bài tập lớn lần này, nhóm 14 muốn trình bày lạinhững gì mà chúng em đã tìm hiểu trong thời gian qua, áp dụng kiến thức thầy dạy vàomột bài toán thực tế.

Trong quá trình hoàn thành bài tập lớn lần này, chúng em đã có sự nỗ lực trongviệc tìm hiểu, nghiên cứu các kiến thức để hoàn thiện bài tập lớn một cách tốt nhấttrong khả năng của mình Nhóm em hi vọng sẽ nhận được những góp ý của thầy để bàitập lớn của chúng em được hoàn thiện hơn.

Kính chúc thầy có thật nhiều sức khỏe và thành công trong con đường giảngdạy của mình, đặc biệt là đưa khoa Hệ thống thông tin quản lý ngày càng phát triểnhơn.

Hà Nội, ngày 26 tháng 3 năm 2023 Học viên

MỤC LỤCii

Trang 5

LỜI CAM ĐOAN i

1.1 Danh sách liên kết đôi 2

1.2 Thuật toán Quick sort 2

PHẦN II Ý TƯỞNG – THUẬT TOÁN – MINH HỌA – ĐỘ PHỨC TẠP 3

2.1 Ý tưởng 3

2.2 Thuật toán 3

2.3 Minh họa thuật toán 4

2.4 Độ phức tạp của thuật toán 5

PHẦN III: ĐÁNH GIÁ CHUNG 6

Trang 6

Hình 1: Cấu trúc danh sách liên kết đôi 2Hình 2: Minh họa thuật toán Quick sort trong danh sách liên kết đơn 2Hình 3: Minh họa thuật toán Quick sort trong danh sách liên kết đôi 5

DANH SÁCH CÁC BẢNG

Bảng 1: So sánh độ phức tạp theo thời gian của thuật toán Merge sort & Quicksort 6Bảng 2: So sánh độ phức tạp trung bình của một số thuật toán sắp xếp 7

iv

Trang 7

LỜI MỞ ĐẦU

Sắp xếp dãy số theo thứ tự tăng dần hay giảm dần là một bài toán sắp xếp đơngiản và cơ bản nhất đối với bất cứ ai học lập trình Nói theo cách khác, bài toán nàychính là bài toán sắp xếp danh sách theo một chiều tăng dần hoặc giảm dần Bài toánsắp xếp dãy số là bài tập điển hình trong phần kiến thức về mảng một chiều Sắp xếpcũng là một kiến thức quan trọng thuộc phần giải thuật trong cấu trúc dữ liệu & giảithuật

Để tìm kiếm một cách nhanh chóng và thuật tiện, con người đã phát minh ra rấtnhiều thuật toán để phục vụ cho nhu cầu đó Đáng kể nhất là thuật toán Quick sort -một thuật toán được sử dụng khá phổ biến trong ngôn ngữ lập trình.

Chính vì thế, trong đề tài này, chúng em sẽ tìm hiểu về thuật toán sắp xếp danhsách liên kết đôi bằng thuật toán Quick sort.

Trang 8

PHẦN I TỔNG QUAN1.1 Danh sách liên kết đôi

Mỗi node trong danh sách liên kết đôi gồm có previous pointer (con trỏ trước),data (giá trị) và next pointer (con trỏ sau).

Previous pointer trỏ tới phần tử đứng trước, next pointer trỏ tới phần tử phía sau.

Hình 1: Cấu trúc danh sách liên kết đôi

1.2 Thuật toán Quick sort

Quick Sort là một thuật toán sử dụng cách thức chia để trị (Divide and Conqueralgorithm) để sắp xếp các phần tử trong một mảng hoặc một danh sách.[1]

Dựa trên khái niệm phân vùng một mảng thành hai danh sách con xung quanhmột phần tử chốt đã được chọn sao cho các phần tử trong danh sách con bên trái nhỏhơn phần tử chốt và các phần tử trong danh sách con bên phải lớn hơn phần tử chốt.[2]Quá trình trên được lặp lại một cách đệ quy trên cả hai danh sách con cho đến khitoàn bộ danh sách được sắp xếp theo yêu cầu đề bài.

Hình 2: Minh họa thuật toán Quick sort trong danh sách liên kết đơn

2

Trang 9

PHẦN II Ý TƯỞNG – THUẬT TOÁN – MINH HỌA – ĐỘ PHỨC TẠP2.1 Ý tưởng

Thuật toán Quick Sort có thể được áp dụng cho danh sách liên kết đôi theo cáchtương tự như áp dụng cho mảng Ý tưởng cơ bản là chọn một phần tử chốt từ danhsách, phân vùng thành hai danh sách con và áp dụng đệ quy thuật toán Quick Sort chocác danh sách con ở hai bên của phần tử chốt [4]

Trong danh sách liên kết đôi, chúng ta có thể chọn bất kỳ nút nào làm phần tửchốt Giả sử chúng ta chọn phần tử đầu tiên của danh sách làm phần tử chốt Sau đó, tacó thể duyệt qua danh sách từ đầu và hoán đổi vị trí các phần tử có giá trị nhỏ hơnphần tử chốt sang bên trái phần tử chốt, còn các phần tử có giá trị lớn hơn phần tử chốtsang bên phải phần tử chốt.

Sau khi các danh sách con được sắp xếp, ta hợp nhất chúng theo thứ tự tăng dầnhoặc giảm dần theo yêu cầu của bài toán [7]

2.2 Thuật toán

void quicksort(list &l){

list l1,l2;node *tag, *p;if(l.head==l.tail) return;{

taolist(l1);taolist(l2);tag = l.head;

l.head = tag->next; // cập nhật lại lheadtag->next = NULL; // cô lập tagtag->prev =NULL;

p = l.head;l.head = p->next;p->next = NULL;

Trang 10

if(p->data <= tag->data) addhead(l1,p->data);else addhead(l2,p->data);

quicksort(l1); // gọi đệ quy sắp xếp l1quicksort(l2);

if(l1.head != NULL){

l.head = l1.head;l1.tail->next = tag;tag->prev = l1.tail;}

else l.head=tag;tag->next =l2.head;if(l2.head !=NULL){

l.tail=l2.tail;l2.head->prev =tag;}

else l.tail = tag;}

2.3 Minh họa thuật toán

4

Trang 11

Hình 3: Minh họa thuật toán Quick sort trong danh sách liên kết đôi

2.4 Độ phức tạp của thuật toán

Độ phức tạp về thời gian của thuật toán Quick sort trong ngôn ngữ lập trình Ctrong các trường hợp khác nhau là:

Trường hợp tốt nhất: trường hợp này xảy ra khi phần tử chốt có giá trị trung vị,tức là số lượng phần tử có giá trị lớn hơn và nhỏ hơn giá trị của phần tử chốt gần nhưbằng nhau (hoặc bằng nhau) Điều này dẫn đến một phân vùng có cân bằng tốt và mỗilệnh gọi đệ quy sẽ chia dãy làm đôi Độ phức tạp về thời gian cho trường hợp nàylà O(n*log n) [4]

Trường hợp xấu nhất: Trường hợp này xảy ra khi phần tử chốt được chọn có giátrị nhỏ nhất hoặc lớn nhất trong dãy cần xử lý Trong trường hợp này, một dãy conkhông có phần tử nào và dãy con còn lại sẽ có (n-1) phần tử, trong đó n là tổng sốphần tử của dãy Do đó, việc sắp xếp và phân vùng sẽ chỉ xảy ra ở một dãy con Độphức tạp về thời gian cho trường hợp này sẽ là O(n²) [4]

Trường hợp trung bình: Trường hợp này xảy ra khi phần tử chốt không phải làphần tử có giá trị trung vị hoặc có giá trị lớn nhất hay nhỏ nhất của dãy hiện hành Độphức tạp về thời gian cho trường hợp này sẽ là O(n*log n) [4]

Trang 12

PHẦN III: ĐÁNH GIÁ CHUNG3.1 Ưu điểm

Là một thuật toán chia để trị giúp giải quyết vấn đề dễ dàng hơn.

Có chi phí hoạt động thấp vì chỉ yêu cầu một lượng nhỏ bộ nhớ để hoạt động.Có nhiều cách để lựa chọn phần tử chốt, giảm thiểu trường hợp xấu nhất xảy ra.Thời gian thực hiện nhanh hơn so với một số thuật toán khác

Trang 13

KẾT LUẬN

Thuật toán sắpxếp

Độ phức tạp (trungbình)Bubble sort O( n2)Selection sort O( n2)Insertion sort O( n2)Merge sort O(nlogn)

Quick sort O(nlogn)Heap sort O(nlogn)Shell sort O( n4/ 3

Bảng 2: So sánh độ phức tạp trung bình của một số thuật toán sắp xếpNhư vậy, việc sử dụng thuật toán Quick sort trong danh sách liên kết đôi là mộtphương pháp hiệu quả vì thời gian trung bình để giải bài toán của thuật toán này làO(nlogn), ít hơn đa số các thuật toán khác (như bảng ở trên) Tuy nhiên, việc sắp xếpdanh sách liên kết đôi bằng thuật toán Quick sort lại gây ra một nhược điểm là có thểgây ra trường hợp xấu nhất, làm tốn thời gian, giảm hiệu suất nếu không chọn phần tửchốt một cách hợp lý Nhìn chung thì thuật toán Quick sort vẫn là một thuật toán giúptăng hiệu quả sắp xếp trong danh sách liên kết.

Trang 14

TÀI LIỆU THAM KHẢO

[1]}]]David Xuân, “QuickSort trên danh sách liên kết kép – Doubly Linked List,” 8 10 2020 [Trực tuyến] Available: https://cafedev.vn/ctdl-quicksort-tren-danh-sach-lien-ket-kep-doubly-linked-list/ [Đã truy câ ™p 20 3 2023].

[2] Dương Anh Đức, “Thuật toán Quick Sort là gì? Giới thiệu lập trình chi tiết nhất,” 26 5 2022 [Trực tuyến] Available: https://teky.edu.vn/blog/thuat-toan-quick-sort/#Do_phuc_tap_cua_thuat_toan_sap_xep_nhanh [Đã truy câ ™p 20 2 2023].

[3] Đỗ Xuân Lôi, Cấu trúc dữ liệu và giải thuật, Hà Nội: Nhà xuất bản Đại học Quốc gia Hà Nội, 2010.

[4] Lê Khiêm, “Thuật toán sắp xếp trong C++,” 4 2 2022 [Trực tuyến] Available: https://topdev.vn/blog/thuat-toan-sap-xep-trong-c/?

fbclid=IwAR3hEfU5MO_F8EL_Mbp7YkCBDqKHsevIl_9QeWWw409NhaywENP86hQdUBU [Đã truy câ ™p 20 3 2023].

[5] Nguyễn Đức Nghĩa, Giáo trình cấu trúc dữ liệu và giải thuật, Hà Nội: Nhà xuất bản Bách khoa - Hà Nội, 2022.

[6] Phạm Văn Ất, Giáo trình Kỹ thuật lập trình C Căn bản & Nâng cao, Hà Nội: Nhà xuất bản Hồng Đức, 2009.

[7] R Sedgewick, "QuickSort on Doubly Linked List," 16 11 2020 [Online] Available:https://www.codesdope.com/blog/article/quicksort-on-doubly-linked-list/?fbclid=IwAR2C91lw0eO-

Ngày đăng: 20/06/2024, 18:04

Xem thêm:

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

TÀI LIỆU LIÊN QUAN

w