Skip to content

Commit 680718c

Browse files
committed
🐛 fix: correct MergeSort SortOp.Insert source indices
1 parent 54900d8 commit 680718c

1 file changed

Lines changed: 25 additions & 11 deletions

File tree

Packages/com.soobak.algo.sorting/Runtime/Scripts/MergeSortAlgorithm.cs

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ public async UniTask ExecuteAsync(SortingState state, IAlgorithmStepSink<Sorting
2323
}
2424

2525
var buffer = new SortingItem[count];
26-
await MergeSortAsync(state, sink, buffer, 0, count - 1, cancellationToken);
26+
var sourceIndices = new int[count];
27+
await MergeSortAsync(state, sink, buffer, sourceIndices, 0, count - 1, cancellationToken);
2728
await sink.PublishAsync(new AlgorithmStep<SortingState, SortOp>(state.Clone(), SortOp.Finalize("Merge sort complete")), cancellationToken);
2829
}
2930
catch (OperationCanceledException ex) {
@@ -36,19 +37,19 @@ public async UniTask ExecuteAsync(SortingState state, IAlgorithmStepSink<Sorting
3637
}
3738
}
3839

39-
async UniTask MergeSortAsync(SortingState state, IAlgorithmStepSink<SortingState, SortOp> sink, SortingItem[] buffer, int left, int right, CancellationToken cancellationToken) {
40+
async UniTask MergeSortAsync(SortingState state, IAlgorithmStepSink<SortingState, SortOp> sink, SortingItem[] buffer, int[] sourceIndices, int left, int right, CancellationToken cancellationToken) {
4041
if (left >= right)
4142
return;
4243

4344
cancellationToken.ThrowIfCancellationRequested();
4445
var mid = left + (right - left) / 2;
4546

46-
await MergeSortAsync(state, sink, buffer, left, mid, cancellationToken);
47-
await MergeSortAsync(state, sink, buffer, mid + 1, right, cancellationToken);
48-
await MergeAsync(state, sink, buffer, left, mid, right, cancellationToken);
47+
await MergeSortAsync(state, sink, buffer, sourceIndices, left, mid, cancellationToken);
48+
await MergeSortAsync(state, sink, buffer, sourceIndices, mid + 1, right, cancellationToken);
49+
await MergeAsync(state, sink, buffer, sourceIndices, left, mid, right, cancellationToken);
4950
}
5051

51-
async UniTask MergeAsync(SortingState state, IAlgorithmStepSink<SortingState, SortOp> sink, SortingItem[] buffer, int left, int mid, int right, CancellationToken cancellationToken) {
52+
async UniTask MergeAsync(SortingState state, IAlgorithmStepSink<SortingState, SortOp> sink, SortingItem[] buffer, int[] sourceIndices, int left, int mid, int right, CancellationToken cancellationToken) {
5253
var leftIndex = left;
5354
var rightIndex = mid + 1;
5455
var bufferIndex = 0;
@@ -60,28 +61,41 @@ async UniTask MergeAsync(SortingState state, IAlgorithmStepSink<SortingState, So
6061
await sink.PublishAsync(new AlgorithmStep<SortingState, SortOp>(state.Clone(), SortOp.Compare(leftIndex, rightIndex)), cancellationToken);
6162

6263
if (state.Items[leftIndex].Value <= state.Items[rightIndex].Value) {
63-
buffer[bufferIndex++] = state.Items[leftIndex++].Clone();
64+
var sourceIndex = leftIndex;
65+
buffer[bufferIndex] = state.Items[leftIndex].Clone();
66+
sourceIndices[bufferIndex++] = sourceIndex;
67+
leftIndex++;
6468
}
6569
else {
66-
buffer[bufferIndex++] = state.Items[rightIndex++].Clone();
70+
var sourceIndex = rightIndex;
71+
buffer[bufferIndex] = state.Items[rightIndex].Clone();
72+
sourceIndices[bufferIndex++] = sourceIndex;
73+
rightIndex++;
6774
}
6875
}
6976

7077
while (leftIndex <= mid) {
7178
cancellationToken.ThrowIfCancellationRequested();
72-
buffer[bufferIndex++] = state.Items[leftIndex++].Clone();
79+
var sourceIndex = leftIndex;
80+
buffer[bufferIndex] = state.Items[leftIndex].Clone();
81+
sourceIndices[bufferIndex++] = sourceIndex;
82+
leftIndex++;
7383
}
7484

7585
while (rightIndex <= right) {
7686
cancellationToken.ThrowIfCancellationRequested();
77-
buffer[bufferIndex++] = state.Items[rightIndex++].Clone();
87+
var sourceIndex = rightIndex;
88+
buffer[bufferIndex] = state.Items[rightIndex].Clone();
89+
sourceIndices[bufferIndex++] = sourceIndex;
90+
rightIndex++;
7891
}
7992

8093
for (var i = 0; i < bufferIndex; i++) {
8194
cancellationToken.ThrowIfCancellationRequested();
8295
var targetIndex = left + i;
8396
state.Replace(targetIndex, buffer[i].Clone());
84-
await sink.PublishAsync(new AlgorithmStep<SortingState, SortOp>(state.Clone(), SortOp.Insert(mid, targetIndex, buffer[i])), cancellationToken);
97+
var sourceIndex = sourceIndices[i];
98+
await sink.PublishAsync(new AlgorithmStep<SortingState, SortOp>(state.Clone(), SortOp.Insert(sourceIndex, targetIndex, buffer[i])), cancellationToken);
8599
}
86100
}
87101
}

0 commit comments

Comments
 (0)