-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMergeSorting.cs
64 lines (55 loc) · 1.94 KB
/
MergeSorting.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using System;
namespace DA.Algorithms.Sorting
{
public static class MergeSorting
{
public static void Sort<T> (T[] array) where T : IComparable<T>
{
int size = array.Length;
T[] tempArray = new T[size];
MergeSort (array, tempArray, 0, size - 1);
}
private static void MergeSort<T> (T[] array, T[] tempArray, int lowerIndex, int upperIndex) where T : IComparable<T>
{
if (lowerIndex >= upperIndex)
{
return;
}
int middleIndex = (lowerIndex + upperIndex) / 2;
MergeSort (array, tempArray, lowerIndex, middleIndex);
MergeSort (array, tempArray, middleIndex + 1, upperIndex);
Merge (array, tempArray, lowerIndex, middleIndex, upperIndex);
}
private static void Merge<T> (T[] array, T[] tempArray, int lowerIndex, int middleIndex, int upperIndex) where T : IComparable<T>
{
int lowerStart = lowerIndex;
int lowerStop = middleIndex;
int upperStart = middleIndex + 1;
int upperStop = upperIndex;
int count = lowerIndex;
while (lowerStart <= lowerStop && upperStart <= upperStop)
{
if (array[lowerStart].CompareTo (array[upperStart]) < 0)
{
tempArray[count++] = array[lowerStart++];
}
else
{
tempArray[count++] = array[upperStart++];
}
}
while (lowerStart <= lowerStop)
{
tempArray[count++] = array[lowerStart++];
}
while (upperStart <= upperStop)
{
tempArray[count++] = array[upperStart++];
}
for (int i = lowerIndex; i <= upperIndex; i++)
{
array[i] = tempArray[i];
}
}
}
}