You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					117 lines
				
				2.0 KiB
			
		
		
			
		
	
	
					117 lines
				
				2.0 KiB
			| 
											3 years ago
										 | /** | ||
|  |  * Mnemonist Quick Sort | ||
|  |  * ===================== | ||
|  |  * | ||
|  |  * Quick sort related functions. | ||
|  |  * Adapted from: https://alienryderflex.com/quicksort/
 | ||
|  |  */ | ||
|  | var LOS = new Float64Array(64), | ||
|  |     HIS = new Float64Array(64); | ||
|  | 
 | ||
|  | function inplaceQuickSort(array, lo, hi) { | ||
|  |   var p, i, l, r, swap; | ||
|  | 
 | ||
|  |   LOS[0] = lo; | ||
|  |   HIS[0] = hi; | ||
|  |   i = 0; | ||
|  | 
 | ||
|  |   while (i >= 0) { | ||
|  |     l = LOS[i]; | ||
|  |     r = HIS[i] - 1; | ||
|  | 
 | ||
|  |     if (l < r) { | ||
|  |       p = array[l]; | ||
|  | 
 | ||
|  |       while (l < r) { | ||
|  |         while (array[r] >= p && l < r) | ||
|  |           r--; | ||
|  | 
 | ||
|  |         if (l < r) | ||
|  |           array[l++] = array[r]; | ||
|  | 
 | ||
|  |         while (array[l] <= p && l < r) | ||
|  |           l++; | ||
|  | 
 | ||
|  |         if (l < r) | ||
|  |           array[r--] = array[l]; | ||
|  |       } | ||
|  | 
 | ||
|  |       array[l] = p; | ||
|  |       LOS[i + 1] = l + 1; | ||
|  |       HIS[i + 1] = HIS[i]; | ||
|  |       HIS[i++] = l; | ||
|  | 
 | ||
|  |       if (HIS[i] - LOS[i] > HIS[i - 1] - LOS[i - 1]) { | ||
|  |         swap = LOS[i]; | ||
|  |         LOS[i] = LOS[i - 1]; | ||
|  |         LOS[i - 1] = swap; | ||
|  | 
 | ||
|  |         swap = HIS[i]; | ||
|  |         HIS[i] = HIS[i - 1]; | ||
|  |         HIS[i - 1] = swap; | ||
|  |       } | ||
|  |     } | ||
|  |     else { | ||
|  |       i--; | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   return array; | ||
|  | } | ||
|  | 
 | ||
|  | exports.inplaceQuickSort = inplaceQuickSort; | ||
|  | 
 | ||
|  | function inplaceQuickSortIndices(array, indices, lo, hi) { | ||
|  |   var p, i, l, r, t, swap; | ||
|  | 
 | ||
|  |   LOS[0] = lo; | ||
|  |   HIS[0] = hi; | ||
|  |   i = 0; | ||
|  | 
 | ||
|  |   while (i >= 0) { | ||
|  |     l = LOS[i]; | ||
|  |     r = HIS[i] - 1; | ||
|  | 
 | ||
|  |     if (l < r) { | ||
|  |       t = indices[l]; | ||
|  |       p = array[t]; | ||
|  | 
 | ||
|  |       while (l < r) { | ||
|  |         while (array[indices[r]] >= p && l < r) | ||
|  |           r--; | ||
|  | 
 | ||
|  |         if (l < r) | ||
|  |           indices[l++] = indices[r]; | ||
|  | 
 | ||
|  |         while (array[indices[l]] <= p && l < r) | ||
|  |           l++; | ||
|  | 
 | ||
|  |         if (l < r) | ||
|  |           indices[r--] = indices[l]; | ||
|  |       } | ||
|  | 
 | ||
|  |       indices[l] = t; | ||
|  |       LOS[i + 1] = l + 1; | ||
|  |       HIS[i + 1] = HIS[i]; | ||
|  |       HIS[i++] = l; | ||
|  | 
 | ||
|  |       if (HIS[i] - LOS[i] > HIS[i - 1] - LOS[i - 1]) { | ||
|  |         swap = LOS[i]; | ||
|  |         LOS[i] = LOS[i - 1]; | ||
|  |         LOS[i - 1] = swap; | ||
|  | 
 | ||
|  |         swap = HIS[i]; | ||
|  |         HIS[i] = HIS[i - 1]; | ||
|  |         HIS[i - 1] = swap; | ||
|  |       } | ||
|  |     } | ||
|  |     else { | ||
|  |       i--; | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   return indices; | ||
|  | } | ||
|  | 
 | ||
|  | exports.inplaceQuickSortIndices = inplaceQuickSortIndices; |