
from __future__ import annotations



def   _a  ( __UpperCamelCase							:	Union[str, Any]     ):
			if len(__UpperCamelCase     ) == 0:
						return []
			lowerCAmelCase__   ,					lowerCAmelCase__			:     Tuple					   =      min(__UpperCamelCase     ), max(__UpperCamelCase     )
			lowerCAmelCase__			:     Optional[int]					   =      int(max_value - min_value     ) + 1
			lowerCAmelCase__			:     Any					   =      [[] for _ in range(__UpperCamelCase     )]

			for i in my_list:
						buckets[int(i - min_value     )].append(__UpperCamelCase     )

			return [v for bucket in buckets for v in sorted(__UpperCamelCase     )]


if __name__ == "__main__":
							from doctest import testmod

							testmod()
							assert bucket_sort([4, 5, 3, 2, 1]) == [1, 2, 3, 4, 5]
							assert bucket_sort([0, 1, -1_0, 1_5, 2, -2]) == [-1_0, -2, 0, 1, 2, 1_5]




"""simple docstring"""


def      __UpperCAmelCase       (      lowercase		):







  """simple docstring"""
  _UpperCAmelCase    			=   0
  _UpperCAmelCase    			=   len(lowercase		)

  for i in range(n - 1		):
    for j in range(i + 1 ,lowercase		):
      if arr[i] > arr[j]:
        num_inversions += 1

  return num_inversions






def      __UpperCAmelCase       (      lowercase		):







  """simple docstring"""
  if len(lowercase		) <= 1:
    return arr, 0
  _UpperCAmelCase    			=   len(lowercase		) // 2
  _UpperCAmelCase    			=   arr[0:mid]
  _UpperCAmelCase    			=   arr[mid:]

  _UpperCAmelCase			,					_UpperCAmelCase    			=   count_inversions_recursive(lowercase		)
  _UpperCAmelCase			,					_UpperCAmelCase    			=   count_inversions_recursive(lowercase		)
  _UpperCAmelCase			,					_UpperCAmelCase    			=   _count_cross_inversions(lowercase ,lowercase		)

  _UpperCAmelCase    			=   inversion_p + inversions_q + cross_inversions
  return c, num_inversions






def      __UpperCAmelCase       (      lowercase ,lowercase		):







  """simple docstring"""
  _UpperCAmelCase    			=   []
  _UpperCAmelCase    			=   _UpperCAmelCase    			=   _UpperCAmelCase    			=   0
  while i < len(lowercase		) and j < len(lowercase		):
    if p[i] > q[j]:
      # if P[1] > Q[j], then P[k] > Q[k] for all  i < k <= len(P)
      # These are all inversions. The claim emerges from the
      # property that P is sorted.
      num_inversion += len(lowercase		) - i
      r.append(q[j]		)
      j += 1
    else:
      r.append(p[i]		)
      i += 1

  if i < len(lowercase		):
    r.extend(p[i:]		)
  else:
    r.extend(q[j:]		)

  return r, num_inversion






def      __UpperCAmelCase       (      ):







  """simple docstring"""
  _UpperCAmelCase    			=   [10, 2, 1, 5, 5, 2, 11]

  # this arr has 8 inversions:
  # (10, 2), (10, 1), (10, 5), (10, 5), (10, 2), (2, 1), (5, 2), (5, 2)

  _UpperCAmelCase    			=   count_inversions_bf(lowercase		)
  _UpperCAmelCase			,					_UpperCAmelCase    			=   count_inversions_recursive(lowercase		)

  assert num_inversions_bf == num_inversions_recursive == 8

  print("""number of inversions = """ ,lowercase		)

  # testing an array with zero inversion (a sorted arr_1)

  arr_a.sort()
  _UpperCAmelCase    			=   count_inversions_bf(lowercase		)
  _UpperCAmelCase			,					_UpperCAmelCase    			=   count_inversions_recursive(lowercase		)

  assert num_inversions_bf == num_inversions_recursive == 0
  print("""number of inversions = """ ,lowercase		)

  # an empty list should also have zero inversions
  _UpperCAmelCase    			=   []
  _UpperCAmelCase    			=   count_inversions_bf(lowercase		)
  _UpperCAmelCase			,					_UpperCAmelCase    			=   count_inversions_recursive(lowercase		)

  assert num_inversions_bf == num_inversions_recursive == 0
  print("""number of inversions = """ ,lowercase		)


if __name__ == "__main__":
    main()
