c#基數(shù)排序Radix sort的實現(xiàn)方法
經典排序算法 - 基數(shù)排序Radix sort
原理類似桶排序,這里總是需要10個桶,多次使用
首先以個位數(shù)的值進行裝桶,即個位數(shù)為1則放入1號桶,為9則放入9號桶,暫時忽視十位數(shù)
例如
待排序數(shù)組[62,14,59,88,16]簡單點五個數(shù)字
分配10個桶,桶編號為0-9,以個位數(shù)數(shù)字為桶編號依次入桶,變成下邊這樣
| 0 | 0 | 62 | 0 | 14 | 0 | 16 | 0 | 88 | 59 |
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |桶編號
將桶里的數(shù)字順序取出來,
輸出結果:[62,14,16,88,59]
再次入桶,不過這次以十位數(shù)的數(shù)字為準,進入相應的桶,變成下邊這樣:
由于前邊做了個位數(shù)的排序,所以當十位數(shù)相等時,個位數(shù)字是由小到大的順序入桶的,就是說,入完桶還是有序
| 0 | 14,16 | 0 | 0 | 0 | 59 | 62 | 0 | 88 | 0 |
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |桶編號
因為沒有大過100的數(shù)字,沒有百位數(shù),所以到這排序完畢,順序取出即可
最后輸出結果:[14,16,59,62,88]
代碼僅供參考
/// <summary>
/// 基數(shù)排序
/// 約定:待排數(shù)字中沒有0,如果某桶內數(shù)字為0則表示該桶未被使用,輸出時跳過即可
/// </summary>
/// <param name="unsorted">待排數(shù)組</param>
/// <param name="array_x">桶數(shù)組第一維長度</param>
/// <param name="array_y">桶數(shù)組第二維長度</param>
static void radix_sort(int[] unsorted, int array_x = 10, int array_y = 100)
{
for (int i = 0; i < array_x/* 最大數(shù)字不超過999999999...(array_x個9) */; i++)
{
int[,] bucket = new int[array_x, array_y];
foreach (var item in unsorted)
{
int temp = (item / (int)Math.Pow(10, i)) % 10;
for (int l = 0; l < array_y; l++)
{
if (bucket[temp, l] == 0)
{
bucket[temp, l] = item;
break;
}
}
}
for (int o = 0, x = 0; x < array_x; x++)
{
for (int y = 0; y < array_y; y++)
{
if (bucket[x, y] == 0) continue;
unsorted[o++] = bucket[x, y];
}
}
}
}
static void Main(string[] args)
{
int[] x = { 999999999, 65, 24, 47, 13, 50, 92, 88, 66, 33, 22445, 10001, 624159, 624158, 624155501 };
radix_sort(x);
foreach (var item in x)
{
if (item > 0)
Console.WriteLine(item + ",");
}
Console.ReadLine();
}
相關文章
C#中的SQLCommand命令與DbTransaction事務處理
這篇文章介紹了C#中的SQLCommand命令與DbTransaction事務處理,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05C#實現(xiàn)DataTable,List和Json轉換的方法
這篇文章主要介紹了C#實現(xiàn)DataTable,List和Json轉換的方法,結合實例形式分析了DataTable、list、DataReader、DataSet等轉換成JSON的相關實現(xiàn)技巧,需要的朋友可以參考下2016-08-08