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