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

trình bày thuật toán sắp xếp radixsort

21 1,7K 5

Đ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 21
Dung lượng 367,5 KB

Nội dung

Nó đơn giản thể hiện trong việc sắp hàng, trong việc phân công công việc, … Ngày nay, trong một thế giới mà khoa học công nghệ mỗi ngày phát triển như vũ bão và nhu cầu khai thác, tìm ki

Trang 1

KHOA MÁY TÍNH

Môn: Cấu trúc dữ liệu & giải thuật

ĐỀ TÀI: Trình bày thuật toán sắp xếp Radixsort

Giảng viên hướng dẫn : Trịnh Đức Tính Sinh viên thực hiện : Nguyễn Đình Hải Quân Lớp : C10T1

MSSV : 100157

Trang 2

MỤC LỤC

LỜI NÓI ĐẦU 3

PHẦN I: LÝ THUYẾT & THUẬT TOÁN VỀ RADIX SORT 4

1.Giới thiệu về Radix Sort 4

2.Mô phỏng qui trình 4

3 Thuật toán sắp xếp Radix sort 5

4.Kết luận 5

5 Ðánh giá độ phức tạp giải thuật 6

PHẦN II CHƯƠNG TRÌNH MINH HOẠ TRỰC QUAN RADIX SORT 7

1.Giới thiệu chương trình trên nền VB.Net 7

Tìm hiểu chương trình: 8

Thiết kế chương trình: 8

a.Viết mã 9

2 Chương trình minh hoạ bằng C++ 13

PHẦN III KẾT LUẬN 17

PHẦN IV.ĐÁNH GIÁ & NHẬN XÉT CỦA GV 18

Trang 3

LỜI NÓI ĐẦU

Khái niệm sắp xếp dường như đã gắn liền với xã hội loài người từ thuở ban đầu củanền văn minh Nó đơn giản thể hiện trong việc sắp hàng, trong việc phân công công việc,

… Ngày nay, trong một thế giới mà khoa học công nghệ mỗi ngày phát triển như vũ bão

và nhu cầu khai thác, tìm kiếm thông tin của con người ngày càng cao thì việc nâng caotính hiệu quả của các giải thuật sắp xếp cũng ngày càng trở nên quan trọng

Trong hầu hết các hệ lưu trữ, quản lý dữ liệu thao tác tìm kiếm là thao tác cơ bản đểkhai thác thông tin Để việc tìm kiếm trở nên hiệu quả và nhanh chóng thì dữ liệu trong

hệ thống cần được tổ chức theo một trật tự nào đó và điều này đòi hỏi chúng ta phải xâydựng những giải thuật sắp xếp thích hợp

Bài báo cáo này nhằm mục đích giới thiệu về Radix Sort, một giải thuật sắp xếp đặcbiệt vì nó gần giống cách sắp xếp theo lô của mà chúng ta vẫn hay làm trong cuộc sốnghằng ngày

Hy vọng nhận được những nhận xét và đánh giá chân thành từ thầy và các bạn

Trang 4

PHẦN I

LÝ THUYẾT & THUẬT TOÁN VỀ RADIX SORT

1.Giới thiệu về Radix Sort

- Radix Sort là một thuật toán sắp xếp tiếp cận theo một hướng hoàn toàn khác sovới các thuật toán khác Nếu như trong các thuật toán khác, cơ sở để sắp xếp luôn là việc

so sánh giá trị của 2 phần tử thì Radix sort lại dựa trên nguyên tắc phân loại thư của bưuđiện Nó không hề quan tâm đến việc so sánh giá trị của phần tử và bản thân việc phânloại và trình tự phân loại sẽ tạo ra thứ tự cho các phần tử

- Ta biết rằng, để chuyển một khối lượng thư lớn đến tay người nhận ở nhiều địaphương khác nhau, bưư điện thường tổ chức một hệ thống phân loại thư phân cấp Trướctiên, các thư đến cùng một tỉnh, thành phố sẽ được sắp chung vào một lô để gửi đến tỉnhthành tương ứng Bưu điện các tỉnh thành này lại thực hiện công việc tương tự Các thưđến cùng một quận, huyện sẽ được xếp vào chung một lô và gửi đến quận, huyện tươngứng Cứ như vậy, các bức thư sẽ được trao đến tay người nhận một cách có hệ thông màcông việc sằp xếp thư không quá nặng nhọc

3 Thuật toán sắp xếp Radix sort.

Có nhiều thuật toán sắp xếp Radix sort như Insertion Sort, Merge Sort, Counting sort.Trong bài chỉ thực hiện theo kiểu Counting Sort (Sắp xếp đếm phân phối) Vì nó thực hiện sắp xếp không dựa trên các thao tác so sánh

Trong bài báo cáo chỉ đề cập đến thuật toán Counting sort

Các bước thực hiện thuật toán như sau:

Bước 1 :

// k cho biết chữ số dùng để phân loại hiện hành

k = 0; // k = 0: hàng đơn vị; k = 1:hàng chục;

Trang 5

Bước 2 :

//Tạo các lô chứa các loại phần tử khác nhau

Khởi tạo 10 lô B0, B1, , B9 rỗng;

Để khắc phục điều này ta thêm chữ số 0 vào phía trước các chữ số ngắn để được mảng các phần tử có chùng chiều dài bằng nhau là 4

Mảng B sau khi thêm các chữ số 0

Trang 6

Phân lô theo hàng chục:

0428 1725

Giải thuật Radix Sort không dựa trên sự so sánh dữ liệu như các giải thuật sắp xếp

khác Với mỗi số nguyên từ dữ liệu sẽ có hai hành động được thực thi

+ Thực hiện phép chia lấy nguyên cho 1 hệ số để lấy phần chữ số d và các chữ số trước nó (bỏ các chữ số sau nó)

Trang 7

+ Thực hiện phép chia lấy dư cho 10 để lấy ra chữ số d (bỏ các chữ số trước d).

5 Ðánh giá độ phức tạp giải thuật

Với một dãy n số, mỗi số có tối đa m chữ số, thuật toán thực hiện m lần các thao tác phân lô và ghép lô Trong thao tác phân lô, mỗi phần tử chỉ được xét đúng một lần, khi ghép cũng vậy

Sau lần phân phối thứ k các phần tử của A vào các lô B0, B1, , B9, và lấy ngược trở

ra, nếu chỉ xét đến k+1 chữ số của các phần tử trong B, ta sẽ có một mảng tăng dần nhờ trình tự lấy ra từ 0 -> 9 Nhận xét này bảo đảm tính đúng đắn của thuật toán

Thuật toán có độ phức tạp tuyến tính nên hiệu quả khi sắp dãy có rất nhiều phần tử, nhất là khi khóa sắp xếp không quá dài so với số lượng phần tử (điều này thường gặp trong thực tế)

Thuật toán cài đặt thuận tiện với các mảng với khóa sắp xếp là chuỗi (ký tự hay số) hơn là khóa số như trong ví dụ

Trang 8

PHẦN II CHƯƠNG TRÌNH MINH HOẠ TRỰC QUAN RADIX SORT

Trong bài báo cáo có sử dụng 2 chương trình minh hoạ được viết bằng 2 ngôn ngữ là:

VB.Net và C++

1.Giới thiệu chương trình trên nền VB.Net

Trang 9

Tìm hiểu chương trình:

Chương trình được hình thành dựa trên ý tưởng là cho 1 tập các số, sau đó sắp xếp các dãy số đó theo thứ tự từ bé đến lớn, với các chức năng lưu mở file

Thiết kế chương trình:

Các thuộc tính thay đổi nhau sau:

-5 textbox: thuộc tính name là tb1,tb2,tb3,tb4,tb5

- Nút ngẫu nhiên: Thuộc tính name là btnn

- Nút sắp xếp: Thuộc tính name là nutbaocao

- Menu: Thuộc tính name là f_menu

- Listbox: Thuộc tính name là cacgiatri

Trang 10

Viết mã

Phần này chỉ đề cập đến các hàm chính trong chương trình

Khởi tạo hàm sắp xếp Radixsort: hàm này dùng tính chất đệ qui Trong đó

ThisList là nguồn cần sắp xếp, Depth là số lần đệ qui

Public Function RecursiveRadixSort(ByRef ThisList As ICollection(Of Integer), _ ByVal Depth As Integer) As ICollection(Of Integer)

If Depth < 0 Then Return ThisList

Dim Bin(1) As ICollection(Of Integer)

Bin(0) = New List(Of Integer) : Bin(1) = New List(Of Integer)

For Each e As Integer In ThisList

Bin(Math.Abs(CInt((e And (&H1 << Depth)) >> Depth))).Add(e)

Next

Dim r As New List(Of Integer)

If Depth = 31 Then

If Bin(1).Count > 0 Then r.AddRange(RecursiveRadixSort(Bin(1), Depth - 1))

If Bin(0).Count > 0 Then r.AddRange(RecursiveRadixSort(Bin(0), Depth - 1)) Else

If Bin(0).Count > 0 Then r.AddRange(RecursiveRadixSort(Bin(0), Depth - 1))

If Bin(1).Count > 0 Then r.AddRange(RecursiveRadixSort(Bin(1), Depth - 1)) End If

Return r

End Function

Trang 11

Khởi tạo hàm Run(): hàm này có tác gán các giá trị vào mảng A sau đó gọi hàm sắp

xếp, trong đó n0,n1,n2,n3,n4 là các giá trị được truyền từ ô textbox ngoài form chính

Public Sub Run()

Dim A() As Integer = {n0, n1, n2, n3, n4}

Dim B As ICollection(Of Integer)

Sự kiện form load ta tạo các giá trị sau:

Private Sub f_main_Load(ByVal sender As System.Object, ByVal e As _

System.EventArgs) Handles MyBase.Load

Tạo chức năng mở file

Private Sub MởFileToolStripMenuItem_Click(ByVal sender As System.Object,_ ByVal e As System.EventArgs) Handles mofile.Click

Trang 12

d = TextBox1.Lines(0) 'd chứa các giá trị trong textbox1

For i = 2 To d + 2 ' i=2 vi gia tri 0 với 1 không phải là giá trị trong listbox mà là:

‘số 0 kết quả và số 1 là phần tử trong listbox

luu.Items.Add(TextBox1.Lines(i)) 'listbox1 sẽ add từ vị trí thứ i tức thứ 2 trong

‘text

tb1.Text = TextBox1.Lines(10) ' lay gia tri add len

tb2.Text = TextBox1.Lines(11) ' lay gia tri add len

tb3.Text = TextBox1.Lines(12) ' lay gia tri add len

tb4.Text = TextBox1.Lines(13) ' lay gia tri add len

tb5.Text = TextBox1.Lines(14) ' lay gia tri add len

lbkq.Text = TextBox1.Lines(2) 'label kết quả chứ hàng thứ 1 trong file lưu Next

chuthich.Visible = True

End If

End Sub

Trang 13

Tạo chức năng cho menu lưu file:

Private Sub LưuFileToolStripMenuItem_Click(ByVal sender As System.Object,_ ByVal e As System.EventArgs) Handles luufile.Click

FileOpen(1, SaveFileDialog1.FileName, OpenMode.Output)

PrintLine(1, 4) 'in ra dong so 1 trong file txt để: kiem tra so phan tu co trong listbox

PrintLine(1, "In ra ket qua sau khi sap xep")

PrintLine(1, lbkq.Text) 'in ra dong so 2 trong file txt để: kiem tra ket qua de xuat ra label khi load file

PrintLine(1, "Thu tu da sap xep de dua vao tung o textbox")

Trang 14

2 Chương trình minh hoạ bằng C++

Ý tưởng: Chương trình được viết trên ý tưởng cho dãy các thẻ sau đó sắp xếp các thẻ này theo thứ tự tăng dần

a.Viết mã

Tạo hàm radixsort

void RadixSort(int *a,int n)

Trang 18

III Kết Luận

Với những kiến thức đã học, với sự giúp đỡ tận tình của các anh chị trên diễn đàn cộng đồng C việt, cùng giáo viên bộ môn em đã thu thập được những kinh nghiệm hết sức quýbáu

Kết hợp cùng với kiến thức đã được trang bị trên lớp em đã có một số suy nghĩ nhằm hoàn thiện đề tài đã giao

Tuy nhiên với trình độ thực tiễn còn hạn chế và một số khó khăn gặp phải trong lúc thực hiện đề tài nên cũng không thể tránh khỏi những thiếu sót em rất mong nhận được sự ý kiến đóng góp từ thầy đề đề tài của em được hoàn thiện hơn

Em xin chân thành cảm ơn thầy Trịnh Đức Tính đã hướng dẫn cho em hoàn thành đồ án này Kính chúc thầy sức khoẻ dồi dào và đạt được nhiều thành tích trong công việc

Đà Nẵng, ngày 29 tháng 12 năm 2012

Sinh viên thực hiện

Nguyễn Đình Hải Quân

Trang 19

IV Đánh giá và nhận xét của giáo viên bộ môn

Trang 20

V Thông Tin Khác

Trong bài làm có sử dụng nguồn từ nhiều nguồn khác nhau cụ thể:

Tuyển tập đồ án tốt nghiệp sinh viên Thanh Hóa

Edison – Blog Archive » Sắp xếp dựa trên cơ số -Radix sort

Recursive Radix Sort - VB.NET | DreamInCode.net

Radix Sort – C++ | DreamInCode.net

Câu lạc bộ Visual Basic NET và C# (VB.NET & C#)

Dự án & Source code VC++ - Cộng đồng C Việt

Ngày đăng: 08/03/2014, 01:26

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w