@@ -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