อัลกอริทึมการเรียงลำดับ Radix ในโครงสร้างข้อมูล

อัลกอริทึมการเรียงลำดับ Radix คืออะไร

Radix Sort เป็นอัลกอริธึมการเรียงลำดับแบบไม่เปรียบเทียบ มันทำงานโดยการจัดกลุ่มตัวเลขแต่ละตัวขององค์ประกอบที่จะเรียงลำดับ จากนั้นจะใช้เทคนิคการเรียงลำดับที่มีความเสถียรเพื่อจัดระเบียบองค์ประกอบตามฐานของมัน มันเป็นอัลกอริธึมการเรียงลำดับเชิงเส้น

กระบวนการเรียงลำดับเกี่ยวข้องกับคุณสมบัติต่อไปนี้:

  • การค้นหาองค์ประกอบสูงสุดและรับจำนวนหลักขององค์ประกอบนั้น มันบอกจำนวนการวนซ้ำที่กระบวนการเรียงลำดับจะตามมา
  • จัดกลุ่มตัวเลขแต่ละตัวขององค์ประกอบในตำแหน่งที่มีนัยสำคัญเท่ากันในการวนซ้ำแต่ละครั้ง
  • กระบวนการจัดกลุ่มจะเริ่มจากหลักที่มีนัยสำคัญน้อยที่สุดและสิ้นสุดที่หลักที่มีนัยสำคัญที่สุด
  • การเรียงลำดับองค์ประกอบตามตัวเลขในตำแหน่งสำคัญนั้น
  • การรักษาลำดับสัมพัทธ์ขององค์ประกอบที่มีค่าคีย์เดียวกัน คุณสมบัติของการเรียงลำดับ Radix นี้จะทำให้การเรียงลำดับมีความเสถียร

การวนซ้ำครั้งสุดท้ายจะทำให้เราได้รับรายการที่จัดเรียงอย่างสมบูรณ์

การทำงานของอัลกอริทึมการเรียงลำดับ Radix

การทำงานของอัลกอริทึมการเรียงลำดับ Radix
รายการจำนวนเต็มที่จะเรียงลำดับ

ลองเรียงลำดับรายการจำนวนเต็มในรูปด้านบนตามลำดับจากน้อยไปมากโดยใช้อัลกอริทึม Radix Sort

ต่อไปนี้เป็นขั้นตอนในการดำเนินการกระบวนการเรียงลำดับ Radix:

ขั้นตอน 1) ระบุองค์ประกอบที่มีค่าสูงสุดในรายการ ในกรณีนี้คือ 835

ขั้นตอน 2) คำนวณจำนวนหลักขององค์ประกอบสูงสุด 835 มี 3 หลักพอดี

ขั้นตอน 3) กำหนดจำนวนการวนซ้ำตามขั้นตอนที่ 2 835 มีตัวเลข 3 หลัก หมายความว่าจำนวนการวนซ้ำจะเป็น 3

ขั้นตอน 4) กำหนดฐานขององค์ประกอบ เนื่องจากเป็นระบบทศนิยม ฐานจึงเป็น 10

ขั้นตอน 5) เริ่มการทำซ้ำครั้งแรก

ก) การทำซ้ำครั้งแรก

การทำงานของอัลกอริทึมการเรียงลำดับ Radix
เรียงตามหลักสุดท้าย

ในการวนซ้ำครั้งแรก เราจะพิจารณาค่าตำแหน่งหน่วยของแต่ละองค์ประกอบ

ขั้นตอน 1) แก้ไขจำนวนเต็มด้วย 10 เพื่อให้ได้หน่วยตำแหน่งขององค์ประกอบ ตัวอย่างเช่น 623 mod 10 ให้ค่า 3 แก่เรา และ 248 mod 10 ให้ค่า 8 แก่เรา

ขั้นตอน 2) ใช้การเรียงลำดับการนับหรือการเรียงลำดับแบบคงที่อื่นๆ เพื่อจัดระเบียบจำนวนเต็มตามหลักที่มีนัยสำคัญน้อยที่สุด เท่าที่เห็น จากรูป 248 จะตกถังที่ 8 623 จะตกถังที่ 3 ไปเรื่อยๆ

หลังจากการวนซ้ำครั้งแรก ตอนนี้รายการจะเป็นดังนี้

การทำงานของอัลกอริทึมการเรียงลำดับ Radix
รายการหลังจากการวนซ้ำครั้งแรก

ดังที่คุณเห็นจากรูปด้านบน รายการยังไม่ได้เรียงลำดับ และต้องมีการวนซ้ำมากขึ้นจึงจะจัดเรียงได้ครบถ้วน

b) การทำซ้ำครั้งที่สอง

การทำงานของอัลกอริทึมการเรียงลำดับ Radix
เรียงลำดับตามหลักสิบ

ในการวนซ้ำนี้ เราจะพิจารณาเลขหลักที่ 10th สถานที่สำหรับกระบวนการคัดแยก

ขั้นตอน 1) หารจำนวนเต็มด้วย 10 248 หารด้วย 10 จะได้ 24

ขั้นตอน 2) แก้ไขเอาต์พุตของขั้นตอนที่ 1 ด้วย 10 24 mod 10 ให้ 4

ขั้นตอน 3) ทำตามขั้นตอนที่ 2 จากการทำซ้ำครั้งก่อน

หลังจากทำซ้ำครั้งที่สอง รายการจะเป็นดังนี้

การทำงานของอัลกอริทึมการเรียงลำดับ Radix
รายการหลังจากการทำซ้ำครั้งที่สอง

จากรูปด้านบนจะเห็นได้ว่ารายการยังเรียงลำดับไม่หมดเนื่องจากยังไม่เรียงลำดับจากน้อยไปมาก

c) การทำซ้ำครั้งที่สาม

การทำงานของอัลกอริทึมการเรียงลำดับ Radix
เรียงลำดับตามหลักร้อยตำแหน่ง

สำหรับการวนซ้ำครั้งสุดท้าย เราต้องการได้หลักที่มีนัยสำคัญที่สุด ในกรณีนี้คือ 100th ตำแหน่งสำหรับจำนวนเต็มแต่ละตัวในรายการ

ขั้นตอน 1) หารจำนวนเต็มด้วย 100… 415 หารด้วย 100 จะได้ 4

ขั้นตอน 2) แก้ไขผลลัพธ์จากขั้นตอนที่ 1 ด้วย 10 4 mod 10 ให้ 4 อีกครั้ง

ขั้นตอน 3) ทำตามขั้นตอนที่ 3 จากการทำซ้ำครั้งก่อน

การทำงานของอัลกอริทึมการเรียงลำดับ Radix
รายการหลังจากการทำซ้ำครั้งที่สาม

ดังที่เราเห็น รายการจะเรียงลำดับจากน้อยไปหามาก การวนซ้ำครั้งสุดท้ายเสร็จสิ้นแล้ว และกระบวนการจัดเรียงก็เสร็จสิ้นแล้ว

รหัสเทียมของอัลกอริทึมการเรียงลำดับ 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
  • ใช้ในเครื่องคอมพิวเตอร์ทั่วไปที่มีการเข้าถึงแบบสุ่มต่อเนื่องซึ่งใช้การป้อนข้อมูลแบบคีย์