Home Manual Reference Source Test Repository

src/sort/fordjohnson.js


export function _fordjohnson ( binarysearch ) {

	const fordjohnson = function ( compare , swap , a , i , j ) {

		var m , k , t , y , p , q , r , x , l , w , s , pairswap ;

		if ( j - i < 2 ) return ;

		k = m = ( j - i ) / 2 | 0 ;

		// compare pairs of elements and put largest elements at the front of the
		// array

		while ( k-- ) {

			if ( compare( a[i+k] , a[i+m+k] ) < 0 ) {

				swap( a , i + k , i + m + k ) ;

			}

		}

		// sort the largest elements at the front recursively

		pairswap = function ( a , i , j ) {
			swap( a , i , j ) ;
			swap( a , i + m , j + m ) ;
		} ;

		fordjohnson( compare , pairswap , a , i , i + m ) ;

		// merge the rest of the array into the front, one item at a time

		p = y = t = 1 ;

		q = 0 ;

		while ( i + m + t <= j ) {

			r = t ;

			while ( r --> q ) {

				w = a[i+m+t-1] ;

				x = binarysearch( compare , a , i , i + m + q , w ) ;
				l = x[0] + x[1] ;

				s = i + m + t ;

				while ( --s > l ) {

					swap( a , s , s - 1 ) ;

				}

			}

			q = t ;

			p *= 2 ;
			y = p - 2 * t ;
			t += y ;

		}

		r = j - i - m ;

		while ( r --> q ) {

			w = a[j-1] ;

			x = binarysearch( compare , a , i , i + m + q , w ) ;
			l = x[0] + x[1] ;

			s = j ;

			while ( --s > l ) {

				swap( a , s , s - 1 ) ;

			}


		}

	} ;

	return fordjohnson ;

}