1、小和问题
# 引申自归并排序 import random def merge_sort(arr): res = merge_fun1(arr) for i in range(0, len(arr)): arr[i] = res[i] return arr def merge_fun1(arr): if len(arr) < 2: return arr mid = len(arr) // 2 left_arr = merge_fun1(arr[:mid]) right_arr = merge_fun1(arr[mid:]) res = [] left_point, right_point = 0, 0 global little_sum while left_point < len(left_arr) and right_point < len(right_arr): if left_arr[left_point] < right_arr[right_point]: little_sum += (len(right_arr) - right_point) * left_arr[left_point] res.append(left_arr[left_point]) left_point += 1 else: res.append(right_arr[right_point]) right_point += 1 res += left_arr[left_point:] res += right_arr[right_point:] return res # for test def generate_random_array(max_size, max_value): arr = random.choices(range(0, max_value), k=random.randint(0, max_size)) return arr little_sum = 0 arr = generate_random_array(max_size=10, max_value=10) print(arr) merge_sort(arr) # print(arr) print(little_sum)
2、荷兰国旗问题
def partition(arr, num): left_border = -1 right_border = len(arr) cur = 0 while cur < right_border: if arr[cur] < num: left_border += 1 arr[left_border], arr[cur] = arr[cur], arr[left_border] cur += 1 elif arr[cur] > num: right_border -= 1 arr[right_border], arr[cur] = arr[cur], arr[right_border] else: cur += 1 return arr
3、随机快排
# 引申自荷兰国旗问题 def quick_sort(arr): if arr == [] and len(arr) < 2: return arr quick_sort_func(arr, 0, len(arr)-1) def quick_sort_func(arr, l, r): if l < r: random_num = random.randint(l, r) arr[random_num], arr[r] = arr[r], arr[random_num] p = partition(arr, l, r) quick_sort_func(arr, l, p[0] - 1) quick_sort_func(arr, p[1] + 1, r) def partition(arr, l, r): left_border = l - 1 right_border = r while l < right_border: if arr[l] < arr[r]: left_border += 1 arr[left_border], arr[l] = arr[l], arr[left_border] l += 1 elif arr[l] > arr[r]: right_border -= 1 arr[right_border], arr[l] = arr[l], arr[right_border] else: l += 1 arr[right_border], arr[r] = arr[r], arr[right_border] return [left_border+1, right_border]
4、排序小结
来源:https://www.cnblogs.com/burry/p/12650899.html