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

GIẢI THUẬT SẮP XẾP SHAKER BÀI TẬP CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

16 3 0

Đ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 16
Dung lượng 1,36 MB

Nội dung

MỤC LỤC CHƯƠNG 1: GIỚI THIỆU 2 1.1 Ý tưởng 2 1.2 Hiện thực 2 1.3 Đánh giá 3 CHƯƠNG 2: SO SÁNH CÁC PHƯƠNG PHÁP SẮP XẾP…………...............4 1. Tại sao cần phải có sắp xếp? 4 2. Đâu mới là thuật toán sắp xếp tốt nhất? 5 CHƯƠNG 3: PHÂN TÍCH VÀ CÀI ĐẶT VÀ MINH HOẠ PHƯƠNG PHÁP SẮP XẾP SHAKER 9 3.1 Thiết kế thuật toán 9 3.2 Ý tưởng thiết kế 9 3.3 Ví dụ 10 CHƯƠNG 4: BÀI TOÁN ÁP DỤNG 12 Phân công thực hiện Nội dung thực hiện Người thực hiện Ghi chú Thu thập dữ liệu Hữu Lợi Phân tích dữ liệu Mỹ Hạnh Xây dựng code Thanh Tín – Hoàng Thi Soạn Word Ngọc Hà LỜI CẢM ƠN Đầu tiên, chúng em xin gửi lời cảm ơn chân thành đến Trường Đại học Đồng Tháp và Khoa Sư phạm Toán Tin đã đưa môn học Cấu trúc dữ liệu và Giải thuật vào chương trình giảng dạy. Đặc biệt, chúng em xin gửi lời cảm ơn sâu sắc đến giảng viên bộ môn – Thầy Vũ Long Vân đã dạy dỗ, truyền đạt những kiến thức quý báu cho em trong suốt thời gian học tập vừa qua. Trong thời gian tham gia lớp học của thầy, chúng em đã có thêm cho mình nhiều kiến thức bổ ích, tinh thần học tập hiệu quả, nghiêm túc. Đây chắc chắn sẽ là những kiến thức quý báu, là hành trang để em có thể vững bước sau này. Bộ môn Cấu trúc dữ liệu và Giải thuật là môn học thú vị, vô cùng bổ ích và có tính thực tế cao. Đảm bảo cung cấp đủ kiến thức, gắn liền với nhu cầu thực tiễn của học viên. Tuy nhiên, do vốn kiến thức còn nhiều hạn chế và khả năng tiếp thu thực tế còn nhiều bỡ ngỡ. Mặc dù chúng em đã cố gắng hết sức nhưng chắc chắn trong bài tập lớn khó có thể tránh khỏi những thiếu sót và nhiều chỗ còn chưa chính xác, kính mong thầy xem xét và góp ý để bài tập của chúng em được hoàn thiện hơn. Chúng em xin chân thành cảm ơn

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT NHÓM CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT NHÓM MỤC LỤC CHƯƠNG 1: GIỚI THIỆU 1.1 Ý tưởng .2 1.2 Hiện thực 1.3 Đánh giá CHƯƠNG 2: SO SÁNH CÁC PHƯƠNG PHÁP SẮP XẾP………… .4 Tại cần phải có xếp? Đâu thuật toán xếp tốt nhất? CHƯƠNG 3: PHÂN TÍCH VÀ CÀI ĐẶT VÀ MINH HOẠ PHƯƠNG PHÁP SẮP XẾP SHAKER 3.1 Thiết kế thuật toán .9 3.2 Ý tưởng thiết kế 3.3 Ví dụ 10 CHƯƠNG 4: BÀI TOÁN ÁP DỤNG 12 iii CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT NHĨM Phân cơng thực Nội dung thực Người thực Thu thập liệu Hữu Lợi Phân tích liệu Mỹ Hạnh Xây dựng code Soạn Word Thanh Tín – Hồng Thi Ngọc Hà Ghi CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT NHÓM LỜI CẢM ƠN Đầu tiên, chúng em xin gửi lời cảm ơn chân thành đến Trường Đại học Đồng Tháp Khoa Sư phạm Tốn Tin đưa mơn học Cấu trúc liệu Giải thuật vào chương trình giảng dạy Đặc biệt, chúng em xin gửi lời cảm ơn sâu sắc đến giảng viên môn – Thầy Vũ Long Vân dạy dỗ, truyền đạt kiến thức quý báu cho em suốt thời gian học tập vừa qua Trong thời gian tham gia lớp học thầy, chúng em có thêm cho nhiều kiến thức bổ ích, tinh thần học tập hiệu quả, nghiêm túc Đây chắn kiến thức quý báu, hành trang để em vững bước sau Bộ môn Cấu trúc liệu Giải thuật mơn học thú vị, vơ bổ ích có tính thực tế cao Đảm bảo cung cấp đủ kiến thức, gắn liền với nhu cầu thực tiễn học viên Tuy nhiên, vốn kiến thức nhiều hạn chế khả tiếp thu thực tế nhiều bỡ ngỡ Mặc dù chúng em cố gắng chắn tập lớn khó tránh khỏi thiếu sót nhiều chỗ cịn chưa xác, kính mong thầy xem xét góp ý để tập chúng em hoàn thiện Chúng em xin chân thành cảm ơn! CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT NHÓM CHƯƠNG 1: GIỚI THIỆU PHƯƠNG PHÁP SẮP XẾP SHAKER 1.1 Ý tưởng Shaker Sort cải tiến Bubble Sort Sau đưa phần tử nhỏ đầu mảng đưa phần tử lớn cuối dãy Do đưa phần tử vị trí hai đầu nên Shaker Sort giúp cải thiện thời gian xếp dãy số giảm độ lớn mảng xét lần so sánh Hình 1.1 Shaker Sort 1.2 Hiện thực void shakerSort(int a[], int n) { int Left = 0; int Right = n - 1; int k = 0; while (Left < Right) { for (int i = Left; i < Right; i++) { if (a[i] > a[i + 1]) { swap(a[i], a[i + 1]); k = i; } } Right = k; for (i = Right; i > Left; i ) { if (a[i] < a[i - 1]) { swap(a[i], a[i - 1]); CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT NHÓM k = i; } } Left = k; } } 1.3 Đánh giá Shaker Sort dạng nâng cao Bubble Sort, độ phức tạp cho trường hợp:  Tốt O(n)  Xấu O(n2)  Trung bình O(n2) Thuật tốn nhận diện mảng xếp CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT NHÓM CHƯƠNG 2: SO SÁNH CÁC PHƯƠNG PHÁP SẮP XẾP Sắp xếp thuật toán kinh điển quan trọng lập trình Vậy đâu thuật tốn xếp tốt nhất? Các so sánh dựa theo kết nghiên cứu tác giả [1] 2.1 Tại cần phải xếp? Thử tượng tượng bạn cần tra cứu từ từ điển, nhiên từ điển lại không xếp theo thứ tự alphabet, từ từ điển xếp theo quy luật ngẫu nhiên Khi đó, việc bạn phải làm lật trang, với trang bạn lại phải cố tìm kiếm xem từ bạn cần tìm có trang hay khơng Và việc khiến bạn phải bỏ nhiều thời gian công sức Tuy nhiên, với từ điển xếp theo thứ tự alphabet cơng việc tra cứu bạn dễ dàng Hay thử lấy ví dụ khác, bạn cho danh sách điểm sinh viên tồn trường, u cầu đặt tìm sinh viên có điểm số cao nhất, việc bạn phải làm duyệt qua sinh viên tìm sinh viên có điểm số cao nhất, cơng việc dễ dàng hồn tồn thực được, câu chuyện không dừng lại Bởi cơng việc u cầu lọc top 10 sinh viên có điểm số cao để phục vụ công tác khen thưởng, với danh sách chưa xếp bạn phải tìm sinh viên có điểm số cao thứ nhất, thứ 2, thứ 3, việc làm cho bạn tốn nhiều thời gian công sức, đặc biệt số lượng sinh viên danh sách tăng thời gian cơng sức bạn bỏ tỉ lệ thuận theo số lượng Tuy nhiên với danh sách sinh viên với điểm số xếp(giả sử xếp theo thứ tự giảm dần), cơng việc bạn đơn giản lấy 10 sinh viên danh sách Qua ví dụ thấy rằng, xếp khiến cho thao tác tìm kiếm hay lọc trở nên dễ dàng nhiều Chính vậy, xếp tốn quan trọng lập trình Trong lập trình có khơng 20 thuật tốn phục vụ cho cơng việc xếp Bảng 2.1 Bảng thống kê số thơng số thuật tốn (Theo Wikipedia) STT Thuật toán Bubble Sort Shaker Sort Selection Sort Insertion Sort Binary Insertion Sort Tốt O(n) O(n) O(n²) O(n) O(n) Độ phức tạp Trung bình O(n²) O(n²) O(n²) O(n²) O(n²) Xấu O(n²) O(n²) O(n²) O(n²) O(n²) Bộ nhớ O(1) O(1) O(1) O(1) O(1) Stable Có Có Khơng Có Có CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Shell Sort O(nlogn) 10 11 12 Heap Sort Merge Sort Quick Sort Counting Sort Radix Sort Flash Sort O(nlogn) O(nlogn) O(nlogn) O(n+k) O(kn) O(n) NHÓM depends on gap sequence O(nlogn) O(nlogn) O(nlogn) O(n + k) O(nk) O(n + r) O(n2) O(nlogn) O(nlogn) O(n²) O(n + k) O(nk) O(n²) O(1) Khơng O(1) Khơng O(n) Có O(logn) Có/Khơng O(n + k) Có O(n + k) Có O(m) Khơng 2.2 Đâu thuật tốn xếp tốt nhất? Có lẽ câu hỏi nhiều người học lập trình, viết tác giả thực thử nghiệm nhỏ với 12 thuật tốn xếp để tìm câu trả lời! Thử nghiệm tiến hành với kích thước liệu đầu vào 3.000, 10.000, 100.000, 300.000, với loại liệu mảng có thứ tự ngẫu nhiên, mảng có thứ tự tăng dần, mảng có thứ tự giảm dần, mảng gần có thứ tự tăng dần (sai số vị trí), mục đích đưa mảng có thứ tự tăng dần Bảng 2.2.1 Bảng thống kê với liệu đầu vào ngẫu nhiên Bảng 2.2.2 Bảng thống kê với liệu đầu vào có thứ tự tăng dần CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT NHÓM Bảng 2.2.3 Bảng thống kê với liệu đầu vào có thứ tự giảm dần Bảng 2.2.4 Bảng thống kê với liệu đầu vào gần có thứ tự tăng dần CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT NHĨM Nhận xét:  Với kích thước liệu đầu vào nhỏ (3000) nhìn chung tốc độ chênh lệch thuật tốn khơng rõ để nhận thấy  Với mảng xếp, Bubble Sort Shaker Sort cho tốc độ nhanh chi phí để biết mảng có thứ tự thuật toán O(n)  Với mảng gần xếp Insertion Sort Binary Insertion Sort lựa chọn tốt số phép hốn đổi phải thực  Selection Sort cho tốc độ chậm đa số trường hợp độ phức tạp O(n2), Selection Sort nên dùng cho trường hợp số lượng phần tử cần xếp không nhiều  Với mảng gần xếp Shaker Sort cho tốc độ nhanh đáng kể so với Bubble Sort, thu hẹp khoảng phải duyệt sau duyệt  Shell Sort, Heap Sort, Merge Sort Quick Sort có tốc độ ổn định xuyên suốt loại liệu đầu vào  Flash Sort(được phát minh Karl-Dietrich Neubert vào năm 1998) thuật tốn cho tốc độ nhanh(thậm chí nhanh Quick Sort) tiêu tốn nhớ, nhiên cách thức xây dựng thuật toán phức tạp  Counting Sort Radix Sort thuật toán cho tốc độ nhanh, nhiên cần đánh đổi cách sử dụng thêm nhớ [1] Haiduc0147, CODELEARNING, ngày 13/12/2020 https://codelearn.io/sharing/dau-moila-thuat-toan-sap-xep-tot-nhat CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT NHÓM CHƯƠNG 3: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT NHÓM CÀI ĐẶT VÀ MINH HOẠ PHƯƠNG PHÁP SẮP XẾP SHAKER 3.1 Thiết kế thuật toán Code chương trình Shakersort 3.2 Ý tưởng thiết kế: -Bước 1: Khai báo kiểu biến giá trị cho biến cần sử dụng đoạn chương trình, cụ thể chương trình sử dụng biến left, right, k + Do có mảng chiều nhiệm vụ thuật toán shakersort ta cần phải gán biến left = (chính biến đầu mảng), right = n-1 (biến cuối mảng), k=n-1 (định vị trí bắt đầu lắc) -Bước 2: Sau đó, ta dùng vịng lặp while với điều kiện lặp left < right Trong vòng lặp while có vịng lặp for nữa, ta hiểu vòng lặp for lượt lượt + Lượt đi: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT  NHĨM Ta duyệt vịng lặp for từ cuối mảng tới đầu mảng, gặp cặp nghịch (số trước lớn số đầu) ta gọi hàm hoán vị (hoặc dùng swap(M[i-1], M[i]) Trong lần lặp đưa giá trị nhỏ mảng vị trí  Dùng biến k đánh dấu để bỏ qua đoạn xếp thứ tự + Lượt về:  Lấy k = left Ta duyệt từ đầu mảng đến cuối mảng vị trí k , gặp cặp nghịch thế( số trước lớn số đầu) ta gọi hàm hoán vị (hoặc dùng swap(M[i] ,M[i+1]);) Trong lần lặp đưa giá trị lớn mảng vị trí cuối  Dùng biến k đánh dấu để bỏ qua đoạn xếp thứ tự Sau gán k = right -Bước 3: Lặp lại bước  Kiểm tra chiều dài đoạn cần xếp = ngưng, cịn > lặp lại bước 3.3 Ví dụ: Ta có mảng cần xếp hình 1.1 Hình 1.1 ShakerSort CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Kết chạy chương trình NHĨM CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT NHĨM CHƯƠNG 4: BÀI TỐN ÁP DỤNG Sử dụng hàm random để tạo dãy M có 1.000 số nguyên Vận dụng thuật toán xếp shaker để xếp phần tử mảng M theo thứ tự tăng dần mặt giá trị CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT NHÓM

Ngày đăng: 13/06/2023, 22:51

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

TÀI LIỆU LIÊN QUAN

w