Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion csharp-algorithms/RadixSort/RadixSort/Program.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using BenchmarkDotNet.Running;
using RadixSort;

var summary = BenchmarkRunner.Run<RadixSortMethods>();
BenchmarkRunner.Run<RadixSortBenchmarks>(args: args);
4 changes: 2 additions & 2 deletions csharp-algorithms/RadixSort/RadixSort/RadixSort.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.13.1" />
<PackageReference Include="BenchmarkDotNet" Version="0.15.8" />
</ItemGroup>

</Project>
43 changes: 43 additions & 0 deletions csharp-algorithms/RadixSort/RadixSort/RadixSortBenchmarks.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
using BenchmarkDotNet.Attributes;

namespace RadixSort;

public class RadixSortBenchmarks
{
private readonly RadixSortMethods _radix = new();
private int[] _source = [];
private int[] _work = [];

[Params("Random", "Sorted", "Imbalanced")]
public string Input { get; set; } = "Random";

[GlobalSetup]
public void Setup()
{
_source = Input switch
{
"Sorted" => RadixSortMethods.CreateSortedArray(20000),
"Imbalanced" => RadixSortMethods.CreateImbalancedArray(
RadixSortMethods.CreateRandomArray(19999, 10000, 30000)),
_ => RadixSortMethods.CreateRandomArray(20000, 10000, 30000)
};
_work = new int[_source.Length];
}

[Benchmark(Baseline = true)]
public int[] RadixSort()
{
_source.CopyTo(_work, 0);

return _radix.RadixSort(_work, _work.Length);
}

[Benchmark]
public int[] ArraySort()
{
_source.CopyTo(_work, 0);
Array.Sort(_work);

return _work;
}
}
143 changes: 79 additions & 64 deletions csharp-algorithms/RadixSort/RadixSort/RadixSortMethods.cs
Original file line number Diff line number Diff line change
@@ -1,93 +1,108 @@
using BenchmarkDotNet.Attributes;
namespace RadixSort;

namespace RadixSort
public class RadixSortMethods
{
public class RadixSortMethods
public int[] RadixSort(int[] array, int size)
{
public IEnumerable<object[]> SampleArrays()
{
yield return new object[] { CreateRandomArray(20000, 10000, 30000), 20000, "Best Case" };
yield return new object[] { CreateSortedArray(20000), 20000, "Average Case" };
yield return new object[] { CreateImbalancedArray(CreateRandomArray(19999, 10000, 30000)), 20000, "Worst Case" };
}
if (size == 0)
return array;

[Benchmark]
[ArgumentsSource(nameof(SampleArrays))]
public int[] RadixSort (int[] array, int size, string arrayName)
{
var maxVal = GetMaxVal(array, size);
var maxVal = GetMaxVal(array, size);

for (long exponent = 1; maxVal / exponent > 0; exponent *= 10)
CountingSort(array, size, exponent);

for (int exponent = 1; maxVal / exponent > 0; exponent *= 10)
CountingSort(array, size, exponent);
return array;
}

public int[] RadixSortWithNegatives(int[] array, int size)
{
if (size == 0)
return array;
}

public static int GetMaxVal(int[] array, int size)
{
var maxVal = array[0];
var minVal = GetMinVal(array, size);

for (int i = 1; i < size; i++)
if (array[i] > maxVal)
maxVal = array[i];
if (minVal >= 0)
return RadixSort(array, size);

return maxVal;
}
for (int i = 0; i < size; i++)
array[i] = checked(array[i] - minVal);

public static void CountingSort(int[] array, int size, int exponent)
{
var outputArr = new int[size];
var occurences = new int[10];
RadixSort(array, size);

for (int i = 0; i < 10; i++)
occurences[i] = 0;
for (int i = 0; i < size; i++)
array[i] += minVal;

for (int i = 0; i < size; i++)
occurences[(array[i] / exponent) % 10]++;
return array;
}

for (int i = 1; i < 10; i++)
occurences[i] += occurences[i - 1];
public static int GetMaxVal(int[] array, int size)
{
var maxVal = array[0];

for (int i = size - 1; i >= 0; i--)
{
outputArr[occurences[(array[i] / exponent) % 10] - 1] = array[i];
occurences[(array[i] / exponent) % 10]--;
}
for (int i = 1; i < size; i++)
if (array[i] > maxVal)
maxVal = array[i];

for (int i = 0; i < size; i++)
array[i] = outputArr[i];
}
return maxVal;
}

public static int[] CreateRandomArray(int size, int lower, int upper)
{
var array = new int[size];
var rand = new Random();
public static int GetMinVal(int[] array, int size)
{
var minVal = array[0];

for (int i = 0; i < size; i++)
array[i] = rand.Next(lower, upper);
for (int i = 1; i < size; i++)
if (array[i] < minVal)
minVal = array[i];

return array;
}
return minVal;
}

public static int[] CreateSortedArray(int size)
{
var array = new int[size];
public static void CountingSort(int[] array, int size, long exponent)
{
var outputArr = new int[size];
var occurrences = new int[10];

for (int i = 0; i < size; i++)
array[i] = i;
for (int i = 0; i < size; i++)
occurrences[(array[i] / exponent) % 10]++;

return array;
}
for (int i = 1; i < 10; i++)
occurrences[i] += occurrences[i - 1];

public static int[] CreateImbalancedArray(int[] array)
for (int i = size - 1; i >= 0; i--)
{
List<int> numbers = new List<int>();
outputArr[occurrences[(array[i] / exponent) % 10] - 1] = array[i];
occurrences[(array[i] / exponent) % 10]--;
}

numbers.AddRange(array);
numbers.Add(Int32.MaxValue);
for (int i = 0; i < size; i++)
array[i] = outputArr[i];
}

return numbers.ToArray();
}
public static int[] CreateRandomArray(int size, int lower, int upper)
{
var array = new int[size];

for (int i = 0; i < size; i++)
array[i] = Random.Shared.Next(lower, upper);

return array;
}

public static int[] CreateSortedArray(int size)
{
var array = new int[size];

for (int i = 0; i < size; i++)
array[i] = i;

return array;
}

public static int[] CreateImbalancedArray(int[] array)
{
List<int> numbers = [.. array, int.MaxValue];

return numbers.ToArray();
}
}
10 changes: 5 additions & 5 deletions csharp-algorithms/RadixSort/RadixSortTests/RadixSortTests.csproj
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>

<IsPackable>false</IsPackable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
<PackageReference Include="MSTest.TestAdapter" Version="2.2.8" />
<PackageReference Include="MSTest.TestFramework" Version="2.2.8" />
<PackageReference Include="coverlet.collector" Version="3.1.2" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.11.0" />
<PackageReference Include="MSTest.TestAdapter" Version="4.5.2" />
<PackageReference Include="MSTest.TestFramework" Version="4.5.2" />
<PackageReference Include="coverlet.collector" Version="10.1.0" />
</ItemGroup>

<ItemGroup>
Expand Down
Loading
Loading