@@ -97,8 +97,17 @@ export class SortingAlgorithms {
9797 }
9898 }
9999
100+ public async oddEvenMergesort ( arr : SortValue [ ] , options : AlgorithmOptions ) {
101+ switch ( options . type ) {
102+ case 'iterative' :
103+ return await this . iterOddEvenMergesort ( arr ) ;
104+ case 'recursive' :
105+ return await this . recOddEvenMergesort ( arr , 0 , this . _columnNbr ) ;
106+ }
107+ }
108+
100109 // TODO: make "parallel"(?)
101- public async oddEvenMergesort ( arr : SortValue [ ] ) {
110+ public async iterOddEvenMergesort ( arr : SortValue [ ] ) {
102111 for ( let p = 1 ; p < arr . length ; p *= 2 ) {
103112 for ( let k = p ; k > 0 ; k = Math . floor ( k / 2 ) ) {
104113 for ( let j = k % p ; j < arr . length - k ; j += 2 * k ) {
@@ -116,6 +125,47 @@ export class SortingAlgorithms {
116125 }
117126 }
118127
128+ private async recOddEvenMergesort (
129+ arr : SortValue [ ] ,
130+ start : number ,
131+ end : number ,
132+ ) {
133+ if ( end - start <= 1 ) return ;
134+
135+ const mid = Math . floor ( ( start + end ) / 2 ) ;
136+ await this . recOddEvenMergesort ( arr , start , mid ) ;
137+ await this . recOddEvenMergesort ( arr , mid , end ) ;
138+
139+ await this . oddEvenMerge ( arr , start , end , 1 ) ;
140+ }
141+
142+ private async oddEvenMerge (
143+ arr : SortValue [ ] ,
144+ start : number ,
145+ end : number ,
146+ dist : number ,
147+ ) {
148+ const newDist = dist * 2 ;
149+ if ( end - start <= newDist && start + dist < arr . length ) {
150+ if ( await this . compare ( arr , start , '>' , start + dist ) ) {
151+ await this . drawAndSwap ( arr , start , start + dist ) ;
152+ }
153+ return ;
154+ }
155+
156+ // Even indices
157+ await this . oddEvenMerge ( arr , start , end , newDist ) ;
158+ // Odd indices
159+ await this . oddEvenMerge ( arr , start + dist , end , newDist ) ;
160+
161+ for ( let i = start + dist ; i < end - dist ; i += newDist ) {
162+ const j = i + dist ;
163+ if ( await this . compare ( arr , i , '>' , j ) ) {
164+ await this . drawAndSwap ( arr , i , j ) ;
165+ }
166+ }
167+ }
168+
119169 public async combSort ( arr : SortValue [ ] , options : AlgorithmOptions ) {
120170 let gap = this . _columnNbr ;
121171 const { shrinkFactor } = options ;
0 commit comments