基數排序是一種非比較性排序演演算法,它通過將待排序的資料拆分成多個數位位進行排序。
public static void RadixSort(int[] array)
{
if (array == null || array.Length < 2)
{
return;
}
//獲取陣列中的最大值,確定排序的位數
int max = GetMaxValue(array);
//進行基數排序
for (int exp = 1; max / exp > 0; exp *= 10)
{
CountingSort(array, exp);
}
}
private static void CountingSort(int[] array, int exp)
{
int arrayLength = array.Length;
int[] output = new int[arrayLength];
int[] count = new int[10];
//統計每個桶中的元素個數
for (int i = 0; i < arrayLength; i++)
{
count[(array[i] / exp) % 10]++;
}
//計算每個桶中最後一個元素的位置
for (int i = 1; i < 10; i++)
{
count[i] += count[i - 1];
}
//從原陣列中取出元素,放入到輸出陣列中
for (int i = arrayLength - 1; i >= 0; i--)
{
output[count[(array[i] / exp) % 10] - 1] = array[i];
count[(array[i] / exp) % 10]--;
}
//將輸出陣列複製回原陣列
for (int i = 0; i < arrayLength; i++)
{
array[i] = output[i];
}
}
private static int GetMaxValue(int[] arr)
{
int max = arr[0];
for (int i = 1; i < arr.Length; i++)
{
if (arr[i] > max)
{
max = arr[i];
}
}
return max;
}
public static void RadixSortRun()
{
int[] array = { 19, 27, 46, 48, 99, 888, 50, 2, 4, 44, 47, 36, 38, 15, 26, 5, 3 };
Console.WriteLine("排序前陣列:" + string.Join(", ", array));
RadixSort(array);
Console.WriteLine("排序後陣列:" + string.Join(", ", array));
}
基數排序是一種穩定的排序演演算法,它的時間複雜度為O(d*(n+r)),其中d是位數,n是元素個數,r是基數(桶的個數)。相比其他比較性排序演演算法,基數排序的優勢在於減少了元素之間的比較次數,並且可以處理負數。但是,基數排序的缺點是需要額外的空間來儲存臨時陣列。
作者名稱:追逐時光者
作者簡介:一個熱愛程式設計、善於分享、喜歡學習、探索、嘗試新事物和新技術的全棧軟體工程師。
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結,否則保留追究法律責任的權利。如果該篇文章對您有幫助的話,可以點一下右下角的【♥推薦♥】,希望能夠持續的為大家帶來好的技術文章,文中可能存在描述不正確的地方,歡迎指正或補充,不勝感激。