อัลกอริทึมการเรียงลำดับ Radix ในโครงสร้างข้อมูล
อัลกอริทึมการเรียงลำดับ Radix คืออะไร
Radix Sort เป็นอัลกอริธึมการเรียงลำดับแบบไม่เปรียบเทียบ มันทำงานโดยการจัดกลุ่มตัวเลขแต่ละตัวขององค์ประกอบที่จะเรียงลำดับ จากนั้นจะใช้เทคนิคการเรียงลำดับที่มีความเสถียรเพื่อจัดระเบียบองค์ประกอบตามฐานของมัน มันเป็นอัลกอริธึมการเรียงลำดับเชิงเส้น
กระบวนการเรียงลำดับเกี่ยวข้องกับคุณสมบัติต่อไปนี้:
- การค้นหาองค์ประกอบสูงสุดและรับจำนวนหลักขององค์ประกอบนั้น มันบอกจำนวนการวนซ้ำที่กระบวนการเรียงลำดับจะตามมา
- จัดกลุ่มตัวเลขแต่ละตัวขององค์ประกอบในตำแหน่งที่มีนัยสำคัญเท่ากันในการวนซ้ำแต่ละครั้ง
- กระบวนการจัดกลุ่มจะเริ่มจากหลักที่มีนัยสำคัญน้อยที่สุดและสิ้นสุดที่หลักที่มีนัยสำคัญที่สุด
- การเรียงลำดับองค์ประกอบตามตัวเลขในตำแหน่งสำคัญนั้น
- การรักษาลำดับสัมพัทธ์ขององค์ประกอบที่มีค่าคีย์เดียวกัน คุณสมบัติของการเรียงลำดับ Radix นี้จะทำให้การเรียงลำดับมีความเสถียร
การวนซ้ำครั้งสุดท้ายจะทำให้เราได้รับรายการที่จัดเรียงอย่างสมบูรณ์
การทำงานของอัลกอริทึมการเรียงลำดับ Radix
ลองเรียงลำดับรายการจำนวนเต็มในรูปด้านบนตามลำดับจากน้อยไปมากโดยใช้อัลกอริทึม Radix Sort
ต่อไปนี้เป็นขั้นตอนในการดำเนินการกระบวนการเรียงลำดับ Radix:
ขั้นตอน 1) ระบุองค์ประกอบที่มีค่าสูงสุดในรายการ ในกรณีนี้คือ 835
ขั้นตอน 2) คำนวณจำนวนหลักขององค์ประกอบสูงสุด 835 มี 3 หลักพอดี
ขั้นตอน 3) กำหนดจำนวนการวนซ้ำตามขั้นตอนที่ 2 835 มีตัวเลข 3 หลัก หมายความว่าจำนวนการวนซ้ำจะเป็น 3
ขั้นตอน 4) กำหนดฐานขององค์ประกอบ เนื่องจากเป็นระบบทศนิยม ฐานจึงเป็น 10
ขั้นตอน 5) เริ่มการทำซ้ำครั้งแรก
ก) การทำซ้ำครั้งแรก
ในการวนซ้ำครั้งแรก เราจะพิจารณาค่าตำแหน่งหน่วยของแต่ละองค์ประกอบ
ขั้นตอน 1) แก้ไขจำนวนเต็มด้วย 10 เพื่อให้ได้หน่วยตำแหน่งขององค์ประกอบ ตัวอย่างเช่น 623 mod 10 ให้ค่า 3 แก่เรา และ 248 mod 10 ให้ค่า 8 แก่เรา
ขั้นตอน 2) ใช้การเรียงลำดับการนับหรือการเรียงลำดับแบบคงที่อื่นๆ เพื่อจัดระเบียบจำนวนเต็มตามหลักที่มีนัยสำคัญน้อยที่สุด เท่าที่เห็น จากรูป 248 จะตกถังที่ 8 623 จะตกถังที่ 3 ไปเรื่อยๆ
หลังจากการวนซ้ำครั้งแรก ตอนนี้รายการจะเป็นดังนี้
ดังที่คุณเห็นจากรูปด้านบน รายการยังไม่ได้เรียงลำดับ และต้องมีการวนซ้ำมากขึ้นจึงจะจัดเรียงได้ครบถ้วน
b) การทำซ้ำครั้งที่สอง
ในการวนซ้ำนี้ เราจะพิจารณาเลขหลักที่ 10th สถานที่สำหรับกระบวนการคัดแยก
ขั้นตอน 1) หารจำนวนเต็มด้วย 10 248 หารด้วย 10 จะได้ 24
ขั้นตอน 2) แก้ไขเอาต์พุตของขั้นตอนที่ 1 ด้วย 10 24 mod 10 ให้ 4
ขั้นตอน 3) ทำตามขั้นตอนที่ 2 จากการทำซ้ำครั้งก่อน
หลังจากทำซ้ำครั้งที่สอง รายการจะเป็นดังนี้
จากรูปด้านบนจะเห็นได้ว่ารายการยังเรียงลำดับไม่หมดเนื่องจากยังไม่เรียงลำดับจากน้อยไปมาก
c) การทำซ้ำครั้งที่สาม
สำหรับการวนซ้ำครั้งสุดท้าย เราต้องการได้หลักที่มีนัยสำคัญที่สุด ในกรณีนี้คือ 100th ตำแหน่งสำหรับจำนวนเต็มแต่ละตัวในรายการ
ขั้นตอน 1) หารจำนวนเต็มด้วย 100… 415 หารด้วย 100 จะได้ 4
ขั้นตอน 2) แก้ไขผลลัพธ์จากขั้นตอนที่ 1 ด้วย 10 4 mod 10 ให้ 4 อีกครั้ง
ขั้นตอน 3) ทำตามขั้นตอนที่ 3 จากการทำซ้ำครั้งก่อน
ดังที่เราเห็น รายการจะเรียงลำดับจากน้อยไปหามาก การวนซ้ำครั้งสุดท้ายเสร็จสิ้นแล้ว และกระบวนการจัดเรียงก็เสร็จสิ้นแล้ว
รหัสเทียมของอัลกอริทึมการเรียงลำดับ Radix
นี่คือรหัสหลอกสำหรับอัลกอริทึมการเรียงลำดับ Radix
radixSortAlgo(arr as an array) Find the largest element in arr maximum=the element in arr that is the largest Find the number of digits in maximum k=the number of digits in maximum Create buckets of size 0-9 k times for j -> 0 to k Acquire the jth place of each element in arr. Here j=0 represents the least significant digit. Use a stable sorting algorithm like counting sort to sort the elements in arr according to the digits of the elements in the jthplace arr = sorted elements
C++ โปรแกรมเพื่อใช้งาน Radix Sort
#include <iostream> using namespace std; // Function to get the largest element in an array int getMaximum(int arr[], int n) { int maximum = arr[0]; for (int i = 1; i < n; i++) { if (maximum < arr[i]) maximum = arr[i]; } return maximum; } // We are using counting sort to sort the elements digit by digit void countingSortAlgo(int arr[], int size, int position) { const int limit = 10; int result[size]; int count[limit] = {0}; // Calculating the count of each integers for (int j = 0; j < size; j++) count[(arr[j] / position) % 10]++; // Calculating the cumulative count for (int j = 1; j < limit; j++) { count[j] += count[j - 1]; } // Sort the integers for (int j = size - 1; j >= 0; j--) { result[count[(arr[j] / position) % 10] - 1] = arr[j]; count[(arr[j] / position) % 10]--; } for (int i = 0; i < size; i++) arr[i] = result[i]; } // The radixSort algorithm void radixSortAlgo(int arr[], int size) { // Get the largest element in the array int maximum = getMaximum(arr, size); for (int position = 1; maximum / position > 0; position *= 10) countingSortAlgo(arr, size, position); } // Printing final result void printResult(int arr[], int size) { for (int i = 0; i < size; i++) { cout << arr[i] << " "; } cout << endl; } int main() { int arr[] = {162, 623, 835, 415, 248}; int size = sizeof(arr) / sizeof(arr[0]); radixSortAlgo(arr, size); printResult(arr, size); }
Output:
162 248 415 623 835
Python โปรแกรมสำหรับอัลกอริทึมการเรียงลำดับ Radix
#Radix Sort using python def countingSortAlgo(arr, position): n = len(arr) result = [0] * n count = [0] * 10 # Calculating the count of elements in the array arr for j in range(0, n): element = arr[j] // position count[element % 10] += 1 # Calculating the cumulative count for j in range(1, 10): count[j] += count[j - 1] # Sorting the elements i = n - 1 while i >= 0: element = arr[i] // position result[count[element % 10] - 1] = arr[i] count[element % 10] -= 1 i -= 1 for j in range(0, n): arr[j] = result[j] def radixSortAlgo(arr): # Acquiring the largest element in the array maximum = max(arr) # Using counting sort to sort digit by digit position = 1 while maximum // position > 0: countingSortAlgo(arr, position) position *= 10 input = [162, 623, 835, 415, 248] radixSortAlgo(input) print(input)
Output:
[162,248,415,623,835]
การวิเคราะห์ความซับซ้อนของการเรียงลำดับแบบ Radix
ความซับซ้อนมีสองประเภทที่ต้องพิจารณา คือ ความซับซ้อนของพื้นที่และความซับซ้อนของเวลา
- ความซับซ้อนของพื้นที่: O(n+b) โดยที่ n คือขนาดของอาร์เรย์และ b คือฐานที่พิจารณา
- ความซับซ้อนของเวลา: O(d*(n+b)) โดยที่ d คือจำนวนหลักขององค์ประกอบที่ใหญ่ที่สุดในอาร์เรย์
ความซับซ้อนของพื้นที่ของการเรียงลำดับแบบเรดิกซ์
สองคุณสมบัติที่ต้องเน้นสำหรับความซับซ้อนของพื้นที่
- จำนวนองค์ประกอบในอาร์เรย์ n.
- ฐานสำหรับแสดงองค์ประกอบ b.
บางครั้งฐานนี้อาจใหญ่กว่าขนาดของอาร์เรย์ได้
ความซับซ้อนโดยรวมจึงเป็น O(n+b)
คุณสมบัติต่อไปนี้ขององค์ประกอบในรายการสามารถทำให้พื้นที่การเรียงลำดับแบบเรดิกซ์ไม่มีประสิทธิภาพ:
- องค์ประกอบที่มีตัวเลขจำนวนมาก
- ฐานขององค์ประกอบมีขนาดใหญ่ เช่น ตัวเลข 64 บิต
ความซับซ้อนของเวลาของการเรียงลำดับแบบเรดิกซ์
คุณสามารถใช้การเรียงลำดับการนับเป็นรูทีนย่อยได้ เนื่องจากการวนซ้ำแต่ละครั้งจะต้องใช้เวลาอีโอ(n+b) เวลา. หากมีการวนซ้ำ เวลาทำงานทั้งหมดจะกลายเป็น O(ง*(n+b)) ที่นี่ “O” หมายถึงฟังก์ชันความซับซ้อน
ความเป็นเชิงเส้นของการเรียงลำดับ Radix
Radix Sort จะเป็นเส้นตรงเมื่อ
- d เป็นค่าคงที่ โดยที่ d คือจำนวนหลักขององค์ประกอบที่ใหญ่ที่สุด
- b ก็ไม่ใหญ่โตนักเมื่อเทียบกับ n.
การเปรียบเทียบ Radix Sort กับอัลกอริธึมการเปรียบเทียบอื่น ๆ
ดังที่เราได้เห็น ความซับซ้อนของการเรียงลำดับแบบ Radix นั้นขึ้นอยู่กับขนาดของคำหรือตัวเลข การเรียงลำดับแบบ Radix จะมีความซับซ้อนเท่ากันสำหรับกรณีเฉลี่ยและกรณีที่ดีที่สุด ซึ่งก็คือ O(d*(n+b)) นอกจากนี้ ยังแตกต่างกันไปตามเทคนิคการเรียงลำดับที่คุณใช้ตรงกลาง ตัวอย่างเช่น คุณสามารถใช้การเรียงลำดับแบบนับหรือการเรียงลำดับด่วนสำหรับอัลกอริทึมการเรียงลำดับระดับกลางภายในการเรียงลำดับแบบ Radix
การประยุกต์ใช้อัลกอริทึมการเรียงลำดับ Radix
การใช้งานที่สำคัญของ Radix Sort คือ:
- Radix Sort สามารถใช้เป็นอัลกอริธึมการค้นหาตำแหน่งที่ใช้ช่วงค่าจำนวนมาก
- ใช้ในการสร้างอาร์เรย์ต่อท้ายในอัลกอริทึม DC3
- ใช้ในเครื่องคอมพิวเตอร์ทั่วไปที่มีการเข้าถึงแบบสุ่มต่อเนื่องซึ่งใช้การป้อนข้อมูลแบบคีย์