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
						
					
					
				| /**
 | |
|  * 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;
 |