26
RADIX RADIX SORT SORT Thành viên nhóm THQL 1-K32: Thành viên nhóm THQL 1-K32: 1. 1. Nguyễn Huy Cường Nguyễn Huy Cường 2. 2. Nguyễn Văn Đức Nguyễn Văn Đức 3. 3. Lê Duy Tiến Lê Duy Tiến 4. 4. Phạm Hồng Tín Phạm Hồng Tín

Radix Sort

Embed Size (px)

Citation preview

Page 1: Radix Sort

RADIX RADIX SORTSORT

Thành viên nhóm THQL 1-K32:Thành viên nhóm THQL 1-K32:1.1. Nguyễn Huy Cường Nguyễn Huy Cường 2.2. Nguyễn Văn ĐứcNguyễn Văn Đức3.3. Lê Duy TiếnLê Duy Tiến4.4. Phạm Hồng TínPhạm Hồng Tín

Page 2: Radix Sort

Giới ThiệuGiới Thiệu

1.1. MSD (Most Significan Digit)MSD (Most Significan Digit)

2.2. LSD (Least Significan Digit)LSD (Least Significan Digit)

3.3. Three-way Radix Quicksort Three-way Radix Quicksort

Page 3: Radix Sort

Ý tưởng thuật toánÝ tưởng thuật toán

Sắp xếp dựa trên cơ số (bit, nhóm bit Sắp xếp dựa trên cơ số (bit, nhóm bit hoặc kí tự)hoặc kí tự)

Chuyển các giá trị trong mảng về hệ Chuyển các giá trị trong mảng về hệ nhị phânnhị phân

Page 4: Radix Sort

1. MSD1. MSDa.a. Ý tưởng thật toán :Ý tưởng thật toán :

+ Xét bit đầu tiên bên trái+ Xét bit đầu tiên bên trái+ Chia ra thành 2 mảng con : + Chia ra thành 2 mảng con :

Mảng con bên trái chứa giá trị 0Mảng con bên trái chứa giá trị 0 Mảng con bên phải chứa giá trị 1Mảng con bên phải chứa giá trị 1

+ Xét tiếp bit thứ hai trên từng mảng con và cũng thực + Xét tiếp bit thứ hai trên từng mảng con và cũng thực hiện chia nhỏ ra thành các hiện chia nhỏ ra thành các mảng con bên trái và bên phảimảng con bên trái và bên phải+ Tiếp tục cho đến bit cuối cùng+ Tiếp tục cho đến bit cuối cùng

Page 5: Radix Sort

Ví dụ :Ví dụ :

Hệ thập phân:Hệ thập phân: 1 1 3 3 5 5 7 7 6 6 2 2Hệ nhị phân :Hệ nhị phân : 001001 011 011 101 101 111 111 110 110 010 010Bước 1 :Bước 1 : 000101 001111 0010 | 10 | 110101 111111 111010Bước 2 : Bước 2 : 00001 | 1 | 001111 0 0110 | 10 | 1001 | 1 | 111111

111100Bước 3 : Bước 3 : 000011 | | 01 0100 | | 010111 | 10 | 1011 | 11 | 1100 | | 111111

11 2 2 3 3 5 5 6 7 6 7

Page 6: Radix Sort

b.Cài đặt :b.Cài đặt :Công cụ hỗ trợ :Công cụ hỗ trợ : Phép Dịch bit (>>,<<)Phép Dịch bit (>>,<<) Phép And bit (&)Phép And bit (&)

Phương Pháp :Phương Pháp :+ Lấy ra bit đầu tiên bên trái của tất cả phần tử + Lấy ra bit đầu tiên bên trái của tất cả phần tử

trong mảng trong mảng + Cho i=l . j=r+ Cho i=l . j=r+ a[i]=0 thì tăng i lên 1,a[i]=1 thì dừng+ a[i]=0 thì tăng i lên 1,a[i]=1 thì dừng+ a[j]=1 thì giảm j xuống 1,a[j]=0 thì dừng+ a[j]=1 thì giảm j xuống 1,a[j]=0 thì dừng+ Nếu i=j thì dừng nếu không thì đổi chỗ vị trí 2 + Nếu i=j thì dừng nếu không thì đổi chỗ vị trí 2

phần tử.phần tử.+ Xét tiếp tới bit cuối cùng + Xét tiếp tới bit cuối cùng

Page 7: Radix Sort

static void radixsort(int[] a, int l, int r, int b)static void radixsort(int[] a, int l, int r, int b) {{ int i = l, j = r;int i = l, j = r; if (l >= r) return;if (l >= r) return; while(true)while(true) {{ while ((i < j) && ((a[i] >> b) & 1) == 0) ++i; while ((i < j) && ((a[i] >> b) & 1) == 0) ++i;

while ((i < j) && ((a[j] >> b) & 1) == 1) --j; while ((i < j) && ((a[j] >> b) & 1) == 1) --j; if (i >= j) break;if (i >= j) break;

exch(a,i,j);exch(a,i,j); }} if (((a[j] >> b) & 1) == 0) ++j; if (((a[j] >> b) & 1) == 0) ++j; if (b > 0)if (b > 0) { { radixsort(a, l, j - 1, b - 1);radixsort(a, l, j - 1, b - 1); radixsort(a, j, r, b - 1);radixsort(a, j, r, b - 1); }} }}

CodeCode

Page 8: Radix Sort

c.Độ phức tạp Sắp xếp mảng n ptử theo z bit ,độ

phức tạp trung bình của MSD là O(n.min(n,log2n)).Trong trường hợp xấu nhất O(n.z)

Page 9: Radix Sort

2. LSD2. LSDa. Ý tưởng thuật toán :a. Ý tưởng thuật toán : Sắp xếp theo cơ số từ nhỏ đến lớn.Sắp xếp theo cơ số từ nhỏ đến lớn. VD: Sắp xếp mảng số thập phân theo hàng đơn VD: Sắp xếp mảng số thập phân theo hàng đơn

vị trước ,rồi tới hàng chục ,hàng trăm….vị trước ,rồi tới hàng chục ,hàng trăm…. Cho danh sách :Cho danh sách : 122 , 289 , 1110 , 2122 , 289 , 1110 , 2 B1: B1: 11111100 , 12 , 1222 , , 22 , 28 , 2899 B2: B2: 0202 , 11 , 111010 , 1 , 12222 , 2 , 28989 B3: B3: 002002 , 1 , 1110110 , , 122122 , , 289289 B4: B4: 00020002 , , 01220122 , , 02890289 , , 11101110 Sau B1 các ptử trong mảng sẽ theo thứ tự 1 chữ Sau B1 các ptử trong mảng sẽ theo thứ tự 1 chữ

số ngoài cùng bên phải.số ngoài cùng bên phải. Sau B2 các ptử trong mảng sẽ theo thứ tự 2 chữ Sau B2 các ptử trong mảng sẽ theo thứ tự 2 chữ

số ngoài cùng bên phải.số ngoài cùng bên phải.

Page 10: Radix Sort

b.Cài đặt :b.Cài đặt :

Phương Pháp :Phương Pháp : Chia các phần tử thành các nhóm 4 bit.Chia các phần tử thành các nhóm 4 bit. Sắp xếp mảng theo các nhóm 4 bit đi từ Sắp xếp mảng theo các nhóm 4 bit đi từ

phải sang trái.phải sang trái. Tiếp tục sắp xếp theo nhóm 4 bit kế tiếp từ Tiếp tục sắp xếp theo nhóm 4 bit kế tiếp từ

phải qua trái , các sắp xếp tiếp theo dựa phải qua trái , các sắp xếp tiếp theo dựa trên mảng số được sắp xếp ở bước trước đó.trên mảng số được sắp xếp ở bước trước đó.

Page 11: Radix Sort

0 7 100 7 10 122122 0 0 0 0 | 0 1 1 1 | 1 0 1 00 0 0 0 | 0 1 1 1 | 1 0 1 0

1 2 11 2 1 289289 0 0 0 1 | 0 0 1 0 | 0 0 0 10 0 0 1 | 0 0 1 0 | 0 0 0 1

4 5 64 5 6 11101110 0 1 0 0 | 0 1 0 1 | 0 1 1 00 1 0 0 | 0 1 0 1 | 0 1 1 0

0 0 20 0 2 22 0 0 0 0 | 0 0 0 0 | 0 0 1 00 0 0 0 | 0 0 0 0 | 0 0 1 0

Page 12: Radix Sort

B1B1: : + Xét nhóm 4 bit đầu tiên bên phải + Xét nhóm 4 bit đầu tiên bên phải

+ Đổi ra số thập phân tương ứng+ Đổi ra số thập phân tương ứng

122 122 10 10 1 1 289 289

289 289 1 1 2 2 2 2

1110 1110 6 6 6 6 11101110

2 2 2 2 10 10 122122

Page 13: Radix Sort

B2B2: : + Xét nhóm 4 bit tiếp theo + Xét nhóm 4 bit tiếp theo

+ Đổi ra số thập phân tương ứng + Đổi ra số thập phân tương ứng

289 289 2 2 0 0 2 2

2 2 0 0 2 2 289 289

1110 1110 5 5 5 5 11101110

122 122 7 7 7 7 122 122

Page 14: Radix Sort

B3B3: : + Xét nhóm 4 bit tiếp theo (cuối cùng) + Xét nhóm 4 bit tiếp theo (cuối cùng)

+ Đổi ra số thập phân tương ứng + Đổi ra số thập phân tương ứng

2 2 0 0 0 0 2 2

289 289 1 1 0 0 122 122

1110 1110 4 4 1 1 289 289

122 122 0 0 4 4 1110 1110

Page 15: Radix Sort

CodeCodestatic void RadixSort(int[] a)static void RadixSort(int[] a)

{ {

int[] t = new int[a.Length];int[] t = new int[a.Length];

int r = 4; int r = 4;

int b = 32;int b = 32;

int[] count = new int[1 << r];int[] count = new int[1 << r];

int[] pref = new int[1 << r];int[] pref = new int[1 << r];

int groups = (int)Math.Ceiling((double)b / int groups = (int)Math.Ceiling((double)b / (double)r);(double)r);

// mask =15,nhi phan la 1111 // mask =15,nhi phan la 1111

int mask = (1 << r) - 1;int mask = (1 << r) - 1;

Page 16: Radix Sort

for (int c = 1, shift = 0; c <= groups; c++, shift += r)for (int c = 1, shift = 0; c <= groups; c++, shift += r)

{{

for (int j = 0; j < count.Length; j++)for (int j = 0; j < count.Length; j++)

count[j] = 0;count[j] = 0;

for (int i = 0; i < a.Length; i++)for (int i = 0; i < a.Length; i++)

count[(a[i] >> shift) & mask]++;count[(a[i] >> shift) & mask]++;

pref[0] = 0;pref[0] = 0;

for (int i = 1; i < count.Length; i++)for (int i = 1; i < count.Length; i++)

pref[i] = pref[i - 1] + count[i - 1];pref[i] = pref[i - 1] + count[i - 1];

for (int i = 0; i < a.Length; i++)for (int i = 0; i < a.Length; i++)

t[pref[(a[i] >> shift) & mask]++] = a[i];t[pref[(a[i] >> shift) & mask]++] = a[i];

t.CopyTo(a, 0);t.CopyTo(a, 0);

}}

}}

Page 17: Radix Sort

c.Độ phức tạp Thời gian để sắp xếp n ptử với w byte

là n.w,do đó thuật toán có độ phức tạp O(n.w) bất kể dữ liệu đầu vào.

Page 18: Radix Sort

Three-Way Quick SortThree-Way Quick Sort

a. Ý tưởng thuật toán :a. Ý tưởng thuật toán :Tương tự Quick Sort nhưng sẽ chia mảng thành 3 Tương tự Quick Sort nhưng sẽ chia mảng thành 3 phần:phần:

+Mảng con trái : gồm các ptử nhỏ hơn khóa+Mảng con trái : gồm các ptử nhỏ hơn khóa

+Mảng con giữa : gồm các ptử bằng khóa+Mảng con giữa : gồm các ptử bằng khóa

+Mảng con phải : gồm các ptử lớn hơn khóa+Mảng con phải : gồm các ptử lớn hơn khóa

Page 19: Radix Sort

Chọn v=a[r] làm khóa để phân đoạn.Chọn v=a[r] làm khóa để phân đoạn. Dùng quick sort chia thành 2 mảng con.Dùng quick sort chia thành 2 mảng con. Mảng con trái:đưa các ptử bằng khóa ra đầu Mảng con trái:đưa các ptử bằng khóa ra đầu

dãydãy Mảng con phải:đưa các ptử bằng khóa ra cuối Mảng con phải:đưa các ptử bằng khóa ra cuối

dãy.dãy. Sau đó đưa khóa và các ptử bằng nó vào Sau đó đưa khóa và các ptử bằng nó vào

đúng vị trí trong dãy.đúng vị trí trong dãy.

Page 20: Radix Sort

static void quicksort(int[] a, int l, int r)static void quicksort(int[] a, int l, int r) {{ if (r <= l) return;if (r <= l) return; int v = a[r];int v = a[r]; int i = l - 1, j = r, p = l - 1, q = r, k;int i = l - 1, j = r, p = l - 1, q = r, k; for (; ; )for (; ; ) {{ while (less(a[++i], v)) ;while (less(a[++i], v)) ; while (less(v, a[--j])) if (j == l) break;while (less(v, a[--j])) if (j == l) break; if (i >= j) break;if (i >= j) break; exch(a, i, j);exch(a, i, j); if (equal(a[i], v)) { p++; exch(a, p, i); }if (equal(a[i], v)) { p++; exch(a, p, i); } if (equal(a[j],v)) { q--; exch(a, q, j); }if (equal(a[j],v)) { q--; exch(a, q, j); } }} exch(a, i, r); j = i - 1; i = i + 1;exch(a, i, r); j = i - 1; i = i + 1; for (k = l; k <= p; k++, j--) exch(a, k, j);for (k = l; k <= p; k++, j--) exch(a, k, j); for (k = r - 1; k >= q; k--, i++) exch(a, k, i);for (k = r - 1; k >= q; k--, i++) exch(a, k, i); quicksort(a, l, j);quicksort(a, l, j); quicksort(a, i, r);quicksort(a, i, r); }}

CodeCode

Page 21: Radix Sort

3.Three-way radix quicksort3.Three-way radix quicksort

Ý tưởng thuật toán :Ý tưởng thuật toán : Sắp xếp danh sách chứa các ptử kiểu chuỗi theo Sắp xếp danh sách chứa các ptử kiểu chuỗi theo

từng ký tự ttương ứng.(Sắp xếp danh sách các từng ký tự ttương ứng.(Sắp xếp danh sách các tên).tên).

Chọn khóa là ký tự đầu tiên bên trái của a[r]Chọn khóa là ký tự đầu tiên bên trái của a[r] Dùng giải thuật 3 way quick sort sắp xếp theo ký Dùng giải thuật 3 way quick sort sắp xếp theo ký

tự đầu tiên bên trái.tự đầu tiên bên trái. Gọi đệ quy cho màng con trái và phải theo ký tự Gọi đệ quy cho màng con trái và phải theo ký tự

đầu tiên của khóa của mỗi mảng.đầu tiên của khóa của mỗi mảng. Gọi đệ quy cho mảng con giữa theo ký tự thú 2 Gọi đệ quy cho mảng con giữa theo ký tự thú 2

của khóa.của khóa.

Page 22: Radix Sort

static bool less(String s, String t, int d) { if (t.Length <= d) return false; if (s.Length <= d) return true; return s[d] < t[d]; }Hàm less xét s[d] có nhỏ hơn t[d] hay không.Nếu độ dài t<=d không tồn tại t[d] falseNếu độ dài s<=d không tồn tại s[d] trueNếu độ dài 2 chuỗi lớn hơn d thì trả về KQ phép so sánh s[d]<t[d].

static bool equal(String s, String t, int d) { return !less(s, t, d) && !less(t, s, d); }Hàm equal xét s[d] có bằng t[d] hay không.

Page 23: Radix Sort

static void StrSort(String[] a, int l, int r, int d)static void StrSort(String[] a, int l, int r, int d) {{ if (r <= l) return;if (r <= l) return; String v = a[r];String v = a[r]; int i = l - 1, j = r, p = l - 1, q = r, k;int i = l - 1, j = r, p = l - 1, q = r, k; while (true)while (true) {{ while (less(a[++i], v, d)) ;while (less(a[++i], v, d)) ; while (less(v, a[--j], d)) if (j == l) break;while (less(v, a[--j], d)) if (j == l) break; if (i >= j) break;if (i >= j) break; exch(a, i, j);exch(a, i, j); if (equal(a[i], v, d)) exch(a, ++p, i);if (equal(a[i], v, d)) exch(a, ++p, i); if (equal(v, a[j], d)) exch(a, --q, j);if (equal(v, a[j], d)) exch(a, --q, j); }}

CodeCode

Page 24: Radix Sort

if (p == q) if (p == q)

if (v.Length > d) StrSort(a, l, r, d + 1);if (v.Length > d) StrSort(a, l, r, d + 1);

if (p == q) return;if (p == q) return;

if (less(a[i], v, d)) i++;if (less(a[i], v, d)) i++;

for (k = l; k <= p; k++, j--) exch(a, k, j);for (k = l; k <= p; k++, j--) exch(a, k, j);

for (k = r; k >= q; k--, i++) exch(a, k, i);for (k = r; k >= q; k--, i++) exch(a, k, i);

StrSort(a, l, j, d);StrSort(a, l, j, d);

if (v.Length >= d) StrSort(a, j + 1, i - 1, d + if (v.Length >= d) StrSort(a, j + 1, i - 1, d + 1);1);

StrSort(a, i, r, d);StrSort(a, i, r, d);

}}

Page 25: Radix Sort

c.Độ phức tạp 3-way radix sort trung bình sử dụng

2N.lnN phép so sánh để sắp xếp mảng có N ptử.

Page 26: Radix Sort

So sánh thời gian thực hiện

MSD LSD Three-Way

1.000.000 1s 0.97s 4.7s

5.000.000 3.2s 2.5s 27s

10.000.000 5.4s 3s 56s

100.000.000 57s 23s Báo lỗi không đủ bộ nhớ.

Thuật toánSố ptử

MSD và LSD sử dụng ngẫu nhiên các số từ 1 100.000.000

Three-way sử dụng các chuỗi ngẫu nhiên từ 1 32 ký tự.

Cấu hình máy thực hiện: CPU duo core 2Ghz , RAM 2Ghz , ngôn ngữ lập trình C# 2005