Phương pháp cơ số RadixSort

Một phần của tài liệu Giáo trình kỹ thuật lập trình 2 (Trang 83 - 87)

Thuật giải sắp xếp theo phương pháp cơ số khơng quan tâm đến việc so sánh giá trị của các phần tử như các thuật giải trước. RadixSort sử dụng cách thức phân loại các con số trong dãy và thứ tự phân loại con con số này để tạo ra thứ tự cho các phần tử. Đây là cách tiếp cận khác so với các phương pháp sắp xếp trước là so sánh các giá trị của các phần tử.

Thuật giải dựa trên ý tưởng chính là sắp xếp từng con số của một dãy các số. Giả sử chúng ta cĩ dãy số như sau: 493 812 715 710 195 437 582 340 385.

Đầu tiên sắp xếp các số theo hàng đơn vị: 493 812 715 710 195 437 582 340

385. Ta được bảng kết quả minh họa như sau:

Số hàng đơn vị Dãy con

0 710 340 1 - 2 812 582 3 493 4 - 5 715 195 385 6 - 7 437 8 - 9 - Bảng 4.1: Sắp theo hàng đơn vị

Lưu ý những phần tử này được đưa vào dãy con theo thứ tự tìm thấy, do đĩ chúng ta cĩ thể thấy là các dãy con chưa cĩ thứ tự. Lúc này chúng ta thu được một danh sách gồm các dãy con từ 0 → 9 như sau:

710 340 812 582 493 715 195 385 437

Tiếp tục chúng ta phân loại các phần tử của dãy trên theo con số của hàng chục: 710 340 812 582 493 715 195 385 437 Số hàng chục Dãy con 0 - 1 710 812 715 2 - 3 437 4 340 5 -

6 -

7 -

8 582 385

9 493 195

Bảng 4.2: Sắp theo hàng chục Lúc này chúng ta thu được danh sách như sau:

710 812 715 437 340 582 385 493 195

Thực hiện tiếp với phân loại các con số hàng trăm:

710 812 715 437 340 582 385 493 195

Số hàng trăm Dãy con

0 - 1 195 2 - 3 340 385 4 437 493 5 582 6 - 7 710 715 8 812 9 - Bảng 4.3: Sắp theo hàng trăm

Thu được danh sách các phần tử từ dãy con được phân loại theo hàng trăm từ 0 → 9.

195 340 385 437 493 582 710 715 812

Như chúng ta thấy thì lúc này dãy đã được sắp!

Tĩm lại để sắp xếp dãy a[1], a[2],..., a[n] giải thuật RadixSort thực hiện như sau:  Xem mỗi phần tử a[i] trong dãy a[1]...a[n] là một số nguyên cĩ tối đa m chữ số  Lần lượt phân loại các chữ số theo hàng đơn vị, hàng chục, hàng trăm...Tại mỗi

bước phân loại ta sẽ nối các dãy con từ danh sách đã phân loại theo thứ tự 0 → 9. Sau khi phân loại xong ở hàng thứ m cao nhất ta sẽ thu được danh sách các phần tử được sắp.

Các bước thực hiện thuật giải:

 Bước 1 : k = 0; // k là chữ số phân loại, k = 0 hàng đơn vị, k = 1 hàng chục...  Bước 2 : // Tạo các dãy chứa phần tử phân loại B[0]...B[9]

Khởi tạo B[0]...B[9] rỗng, chưa chứa phần tử nào, B[i] sẽ chứa các phần tử cĩ chữ số thứ k là i.

o For i=1 to n do

 Đặt a[i] vào dãy B[j] với j là chữ số thứ k của a[i]. o Nối B[0], B[1],..., B[9] lại theo đúng trình tự thành a.  Bước 4 :

o k = k +1

o Nếu k < m: ⇒ Bước 2. // m là số lượng chữ số tối đa của các số trong mảng (adsbygoogle = window.adsbygoogle || []).push({});

o Ngược lại: ⇒ Dừng.

Giải thuật sắp xếp theo cơ số RadixSort:

 Mảng a[MAX] chứa các phần tử của mảng cần sắp tăng.

 Mảng B[10][MAX] chứa các dãy số được phân tạm thời theo các con số. Ví dụ B[0] chứa các phần tử cĩ con số ở hàng đơn vị là 100, 210, 320...Khi đĩ với mỗi dịng của B thì sẽ phân các phần tử cĩ con số ở hàng thứ i (i từ 0 - 9), các giá trị cột j sẽ lần lượt chứa các phần tử cĩ cùng con số ở hàng thứ i.

 Mảng Len[10] chứa số lượng các phần tử của các dịng B[i]. Ví dụ B[0] cĩ 3 phần tử thì Len[0] = 3, B[5] cĩ 2 phần tử thì B[5] = 2. Tại mỗi bước trước khi phân các phần tử vào mảng B thì các Len[i] được khởi tạo là 0.

Cài đặt RadixSort:

void RadixSort(long a[], int n) {

int i, j, d;

int h = 10; // biến để lấy các con số, bắt đầu từ hàng đơn vị

long B[10][MAX]; // mảng hai chiều chứa các phần tử phân lơ

int Len[10]; // kích thước của từng mảng B[i]

// MAXDIGIT là số con số tối đa của các phần tử a[i] for(d = 0; d < MAXDIGIT; d++)

{

// khởi tạo kích thước các dãy B[i] là 0 for( i = 0; i < 10; i++)

Len[i] = 0;

// thực hiện phân lơ các phần tử theo con số hàng thứ d tính từ cuối for(i = 0; i < n; i++) // duyệt qua tất cả các phần tử của mảng {

digit = (a[i] % h) / (h/ 10); // lấy con số theo hàng h // đưa vào dãy (lơ) B[digit] ở cột Len[digit]

B[digit][Len[digit]++] = a[i]; }// end for i

// thực hiện nối lại tuần tự từ B[0] – đến B[9] vào mảng a[] ban đầu

num = 0; // chỉ số bắt đầu cho mảng a[]

for(i = 0; i < 10; i++) // duyệt qua các dãy từ B[0] – đến B[9]

{

// lấy từng phần tử của từng dãy B[i] for(j =0; j < Len[i]; j++) a[num++] = B[i][j]; }// end for i h *= 10; // qua hàng kế tiếp. }// end for d }// end RadixSort 

Chương 2 Stack - Queue



Một phần của tài liệu Giáo trình kỹ thuật lập trình 2 (Trang 83 - 87)