-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRecursiveMergeSort.qs
More file actions
55 lines (46 loc) · 2.03 KB
/
RecursiveMergeSort.qs
File metadata and controls
55 lines (46 loc) · 2.03 KB
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
namespace RecursiveMergeSort {
// Define the merge sort operation
operation MergeSort(inputArray : Int[], startIndex : Int, endIndex : Int) : Int[] {
// Base case: if the array has one or zero elements, it is already sorted
if (endIndex - startIndex <= 0) {
return inputArray;
}
// Calculate the middle index to divide the array into two halves
let middleIndex = startIndex + (endIndex - startIndex) / 2;
// Recursively sort the left and right halves of the array
let leftSortedArray = MergeSort(inputArray, startIndex, middleIndex);
let rightSortedArray = MergeSort(inputArray, middleIndex + 1, endIndex);
// Merge the sorted halves
return Merge(leftSortedArray, rightSortedArray);
}
// Define the merge operation to merge two sorted arrays
operation Merge(leftArray : Int[], rightArray : Int[]) : Int[] {
mutable mergedArray = new Int[leftArray + rightArray].Zero();
mutable leftIndex = 0;
mutable rightIndex = 0;
mutable mergedIndex = 0;
// Merge the two sorted arrays
while (leftIndex < Length(leftArray) and rightIndex < Length(rightArray)) {
if (leftArray[leftIndex] < rightArray[rightIndex]) {
set mergedArray w/= mergedIndex <- leftArray[leftIndex];
set leftIndex += 1;
} else {
set mergedArray w/= mergedIndex <- rightArray[rightIndex];
set rightIndex += 1;
}
set mergedIndex += 1;
}
// Copy any remaining elements from the left and right arrays
while (leftIndex < Length(leftArray)) {
set mergedArray w/= mergedIndex <- leftArray[leftIndex];
set leftIndex += 1;
set mergedIndex += 1;
}
while (rightIndex < Length(rightArray)) {
set mergedArray w/= mergedIndex <- rightArray[rightIndex];
set rightIndex += 1;
set mergedIndex += 1;
}
return mergedArray;
}
}