Radix sort เป็นอัลกอริธึมการเรียงลำดับแบบไม่เปรียบเทียบ อัลกอริธึมการเรียงลำดับนี้ทำงานบนคีย์จำนวนเต็มโดยการจัดกลุ่มตัวเลขซึ่งมีตำแหน่งและค่าเหมือนกัน ฐานเป็นฐานของระบบตัวเลข อย่างที่เราทราบดีว่าในระบบทศนิยม ฐานหรือฐานคือ 10 ดังนั้นสำหรับการจัดเรียงตัวเลขทศนิยม เราต้องใช้กล่องตำแหน่ง 10 ช่องเพื่อเก็บตัวเลข
ความซับซ้อนของเทคนิคการจัดเรียง Radix
- ความซับซ้อนของเวลา:O(nk)
- ความซับซ้อนของอวกาศ:O(n+k)
อินพุตและเอาต์พุต
Input: The unsorted list: 802 630 20 745 52 300 612 932 78 187 Output: Data before Sorting: 802 630 20 745 52 300 612 932 78 187 Data after Sorting: 20 52 78 187 300 612 630 745 802 932
อัลกอริทึม
radixSort(array, size, maxDigit)
ป้อนข้อมูล - อาร์เรย์ของข้อมูลและจำนวนทั้งหมดในอาร์เรย์ จำนวนหลักของจำนวนสูงสุด
ผลลัพธ์ − จัดเรียงอาร์เรย์
Begin define 10 lists as pocket for i := 0 to max -1 do m = 10^i+1 p := 10^i for j := 0 to n-1 do temp := array[j] mod m index := temp / p pocket[index].append(array[j]) done count := 0 for j := 0 to radix do while pocket[j] is not empty array[count] := get first node of pocket[j] and delete it count := count +1 done done End
ตัวอย่าง
#include<iostream> #include<list> #include<cmath> using namespace std; void display(int *array, int size) { for(int i = 0; i<size; i++) cout << array[i] << " "; cout << endl; } void radixSort(int *arr, int n, int max) { int i, j, m, p = 1, index, temp, count = 0; list<int> pocket[10]; //radix of decimal number is 10 for(i = 0; i< max; i++) { m = pow(10, i+1); p = pow(10, i); for(j = 0; j<n; j++) { temp = arr[j]%m; index = temp/p; //find index for pocket array pocket[index].push_back(arr[j]); } count = 0; for(j = 0; j<10; j++) { //delete from linked lists and store to array while(!pocket[j].empty()) { arr[count] = *(pocket[j].begin()); pocket[j].erase(pocket[j].begin()); count++; } } } } int main() { int n, max; cout << "Enter the number of elements: "; cin >> n; cout << "Enter the maximum digit of elements: "; cin >> max; int arr[n]; //create an array with given number of elements cout << "Enter elements:" << endl; for(int i = 0; i<n; i++) { cin >> arr[i]; } cout << "Data before Sorting: "; display(arr, n); radixSort(arr, n, max); cout << "Data after Sorting: "; display(arr, n); }
ผลลัพธ์
Enter the number of elements: 10 Enter the maximum digit of elements: 3 Enter elements: 802 630 20 745 52 300 612 932 78 187 Data before Sorting: 802 630 20 745 52 300 612 932 78 187 Data after Sorting: 20 52 78 187 300 612 630 745 802 932