diff --git a/sorting/dotnet/Sorting.Tests/SortingTests.cs b/sorting/dotnet/Sorting.Tests/SortingTests.cs index 26a0e47..5287fe8 100644 --- a/sorting/dotnet/Sorting.Tests/SortingTests.cs +++ b/sorting/dotnet/Sorting.Tests/SortingTests.cs @@ -7,33 +7,33 @@ namespace Sorting.Tests public class SortingTests { [TestMethod] - public void HeapSorting_MergeSortedLists_EachListHasDifferentAmountOfNumbers() + public void MergeSorting_MergeSortedLists_EachListHasDifferentAmountOfNumbers() { - var sort = new HeapSort(); + var sort = new MergeSort(); var result = sort.MergeSortedLists(new List { 3 }, new List { 2, 4 }); CollectionAssert.AreEqual(new List { 2, 3, 4 }, result); } [TestMethod] - public void HeapSorting_MergeSortedLists_EachListHasSameAmountOfNumbers() + public void MergeSorting_MergeSortedLists_EachListHasSameAmountOfNumbers() { - var sort = new HeapSort(); + var sort = new MergeSort(); var result = sort.MergeSortedLists(new List { 1, 3 }, new List { 2, 4 }); CollectionAssert.AreEqual(new List { 1, 2, 3, 4 }, result); } [TestMethod] - public void HeapSorting_SimpleListDividesNeatlyIntoTwo() + public void MergeSorting_SimpleListDividesNeatlyIntoTwo() { - ExecuteTestWithSortMethod(new HeapSort(), new List { 4, 3, 2, 1 }, new List { 1, 2, 3, 4 }); + ExecuteTestWithSortMethod(new MergeSort(), new List { 4, 3, 2, 1 }, new List { 1, 2, 3, 4 }); } [TestMethod] - public void HeapSorting_SimpleListUnevenNumbers() + public void MergeSorting_SimpleListUnevenNumbers() { - ExecuteTestWithSortMethod(new HeapSort(), new List { 5, 7, 6, 4, 3, 2, 1 }, new List { 1, 2, 3, 4, 5, 6, 7 }); + ExecuteTestWithSortMethod(new MergeSort(), new List { 5, 7, 6, 4, 3, 2, 1 }, new List { 1, 2, 3, 4, 5, 6, 7 }); } private void ExecuteTestWithSortMethod(ISortable sortable, List toSort, List expected) diff --git a/sorting/dotnet/Sorting/MergeSort.cs b/sorting/dotnet/Sorting/MergeSort.cs new file mode 100644 index 0000000..c219cdf --- /dev/null +++ b/sorting/dotnet/Sorting/MergeSort.cs @@ -0,0 +1,88 @@ +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; + +namespace Sorting +{ + public class MergeSort : ISortable + { + public List Sort(List list) + { + return SortRecur(list); + } + + internal List MergeSortedLists(List a, List b) + { + var result = new List(); + var aCounter = 0; + var bCounter = 0; + + Debug.WriteLine("merging" + a.AsString() + " with " + b.AsString()); + + while (aCounter < a.Count && bCounter < b.Count) + { + var currA = a[aCounter]; + var currB = b[bCounter]; + + if (currA < currB) + { + result.Add(currA); + aCounter++; + } + else + { + result.Add(currB); + bCounter++; + } + } + + if (aCounter < a.Count) + { + result.AddRange(AddRemainder(a, aCounter)); + } + if (bCounter < b.Count) + { + result.AddRange(AddRemainder(b, bCounter)); + } + + return result; + } + + private List AddRemainder(List list, int index) + { + List result = new List(); + for (var i = index; i < list.Count; i++) + { + result.Add(list[i]); + } + + return result; + } + + private List SortRecur(List list) + { + Debug.WriteLine("sorting " + list.AsString()); + + if (list.Count == 2) + { + return new List + { + list[0] < list[1] ? list[0] : list[1], + list[0] < list[1] ? list[1] : list[0] + }; + } + if (list.Count <= 1) + { + return list; + } + + var halfIndex = list.Count / 2; + + var left = list.TakeWhile((number, i) => i < halfIndex).ToList(); + var right = list.Except(left).ToList(); + return MergeSortedLists( + SortRecur(left), + SortRecur(right)); + } + } +} \ No newline at end of file diff --git a/sorting/dotnet/Sorting/Program.cs b/sorting/dotnet/Sorting/Program.cs deleted file mode 100644 index d888435..0000000 --- a/sorting/dotnet/Sorting/Program.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Sorting -{ - class Program - { - static void Main(string[] args) - { - } - } -}