Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 21 trang
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
BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG CAO ĐẲNG CN & KD VIỆT TIẾN
KHOA MÁY TÍNH
Môn: Cấu trúc dữ liệu & giải thuật
ĐỀ TÀI: Trình bàythuậttoánsắpxế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
Đà Nẵng, Ngày 25 tháng 1 năm 2013
Báo Cáo Môn Học: CTDL> SVTH: Nguyễn Đình Hải Quân
MỤC LỤC
!"#$%"&
'()*)+,&
-+)'./,01/2/,3//456789):47/;
<=>7?@ABC;
"DEFGC;
&/HB#IJEAKE7?@AIBC;
L##MNEOPEH
-+))Q
RST</7U)4V/7WR,8789):47/Q
?K%X
"RYZC%BP[\R]];
)))^K'H=_`KOMXa!=IbEMcHde?#?fC@MN
MgR!h#B[N%Di%MXHEMYj_`%KIOGk[#Q
Trang 2
Báo Cáo Môn Học: CTDL> SVTH: Nguyễn Đình Hải Quân
LỜI NÓI ĐẦU
Khái niệm sắpxếp dường như đã gắn liền với xã hội loài người từ thuở ban đầu của
nề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 cao
tính hiệu quả của các giải thuật sắpxế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ây
dựng những giải thuậtsắpxế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ậtsắpxếp đặc
biệt vì nó gần giống cách sắpxếp theo lô của mà chúng ta vẫn hay làm trong cuộc sống
hằ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 3
Báo Cáo Môn Học: CTDL> SVTH: Nguyễn Đình Hải Quân
PHẦN I
LÝ THUYẾT & THUẬTTOÁN VỀ RADIX SORT
1.Giới thiệu về Radix Sort
- Radix Sort là một thuật toánsắpxếp tiếp cận theo một hướng hoàn toàn khác so
với các thuậttoán khác. Nếu như trong các thuậttoán khác, cơ sở để sắpxế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ân
loạ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 địa
phươ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ước
tiê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ỉnh
thà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ằpxếp thư không quá nặng nhọc.
2.Mô phỏng qui trình
- Trước tiên, ta có thể giả sử mỗi phần tử a
i
trong dãy a1, a2, …, an là một số nguyên
có tối đa m chữ số.
- Ta phân loại các phần tử lần lượt theo các chữ số hàng đơn vị, hàng chục, hàng
trăm, . tương tự việc phân loại thư theo tỉnh thành, quận huyện, phường xã,
3. Thuậttoánsắpxếp Radix sort.
Có nhiều thuậttoánsắpxế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ắpxế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ậttoán Counting sort.
Các bước thực hiện thuậttoá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 4
Báo Cáo Môn Học: CTDL> SVTH: Nguyễn Đình Hải Quân
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;
Bước 3 :
For i = 1 n do
Ðặt ai vào lô Bt với t = chữ số thứ k của a
i
;
Bước 4 :
Nối B0, B1, ., B9 lại (theo đúng trình tự) thành a.
Bước 5 :
k = k+1;
Nếu k < m thì trở lại bước 2.
Ngược lại: Dừng
Ví dụ:
Ta có mảng B gồm các phẩn tử như sau:
7013 8421 1239 428 1424 7009 4518 3252 9170 999 1725 701
Trong Radix Sort sẽ có một điều không thuận tiện là danh sách các số nguyên vì trong
danh sách ấy có thể có các số nguyên có chiều dài không bằng nhau.
Để 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.
7013 8421 1239 0428 1424 7009 4518 3252 9170 0999 1725 0701
Phân lô theo hàng đơn vị:
0999
1725 4518 7009
9170 0701 3252 7013 1424 8425 0428 1239
0 1 2 3 4 5 6 7 8 9
Ta được mảng B như sau:
9170 0701 3252 7013 1424 8425 1725 0428 4518 1239 7009 0999
Trang 5
Báo Cáo Môn Học: CTDL> SVTH: Nguyễn Đình Hải Quân
Phân lô theo hàng chục:
0428
1725
7009 4518 8425
0701 7013 1424 1239 3252 9170 0999
0 1 2 3 4 5 6 7 8 9
Ta được mảng B như sau:
0701 7009 7013 4518 1424 8425 1725 0428 1239 3252 9170 0999
Phân lô theo hàng trăm:
0428
7013 3252 8425 1725
7009 9170 1239 1424 4518 0701 0999
0 1 2 3 4 5 6 7 8 9
Ta được mảng B như sau:
7009 7013 9170 1239 3252 1424 8425 0428 4518 0701 1725 0999
Phân lô theo hàng nghìn:
0999 1725
0701 1424 7013
0428 1239 3252 4518 7009 8425 9170
0 1 2 3 4 5 6 7 8 9
Ta được mảng B đã sắpxếp hoàn thành như sau:
0428 0701 0999 1239 1424 1725 3252 4518 7009 7013 8425 9170
4.Kết luận
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ậtsắpxế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 6
Báo Cáo Môn Học: CTDL> SVTH: Nguyễn Đình Hải Quân
+ 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ậttoá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ắpxế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ắpxếp là chuỗi (ký tự hay số)
hơn là khóa số như trong ví dụ.
Trang 7
Báo Cáo Môn Học: CTDL> SVTH: Nguyễn Đình Hải Quân
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 8
Báo Cáo Môn Học: CTDL> SVTH: Nguyễn Đình Hải Quân
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ắpxế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 9
Báo Cáo Môn Học: CTDL> SVTH: Nguyễn Đình Hải Quân
a. 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ắpxế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 10
[...]... ghi!") Finally FileClose(1) End Try End If End Sub Trang 13 Báo Cáo Môn Học: CTDL> SVTH: Nguyễn Đình Hải Quân 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 14 Báo Cáo Môn Học: CTDL> SVTH: Nguyễn Đình Hải Quân { int i,b[MAX],m=0,exp=1; for(i=0;i . VIỆT TIẾN
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. 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 đặc
biệt vì nó gần giống cách sắp xếp theo