1.2 归并排序
"""
递归:每次选择数组中点,左右两边都已排好序,只需将有序的两边合并
"""
def merge_sort(arr, left, right):
"""
归并排序
:param arr: 待排序数组
:param left: 需排序的元素范围的左下标,对整个数组排序时,初始为0
:param right: 需排序的元素范围的右下标,对整个数组排序时,初始为数组长度减1
:return:
"""
if right - left <= 0:
return
mid = int((left + right) / 2)
merge_sort(arr, left, mid)
merge_sort(arr, mid + 1, right)
merge(arr, left, mid, right)
def merge(arr, left, mid, right):
temp_list = []
i = left
j = mid + 1
while i <= mid and j <= right:
if arr[i] <= arr[j]:
temp_list.append(arr[i])
i += 1
else:
temp_list.append(arr[j])
j += 1
if i > mid:
temp_list.extend(arr[j:right + 1])
else:
temp_list.extend(arr[i:mid + 1])
for k in range(left, right + 1):
arr[k] = temp_list[k - left]
if __name__ == '__main__':
import random
def get_list(n=10, min_num=0, max_num=10):
return [random.randint(min_num, max_num) for _ in range(n)]
arr_list = get_list()
print(arr_list)
merge_sort(arr_list, 0, len(arr_list) - 1)
print(arr_list)
小和问题
"""
小和:当前元素前面比该元素值小的元素值求和,对每个元素进行这么处理后的累计和
示例:
1 3 2 4
数组0位置前面小的数 + 数组1位置前面小的数 + ...
0 + 1 + 1 + (1+3+2) = 8
该问题相当于:对当前元素来说,求后边有多少个元素值比自己大,然后用自身值乘上数量,再对每个元素依次操作累计求和
"""
def get_min_sum(arr, left, right):
if right - left < 1:
return 0
mid = int((left + right) / 2)
count_left = get_min_sum(arr, left, mid)
count_right = get_min_sum(arr, mid + 1, right)
count_merge = merge(arr, left, mid, right)
return count_left + count_right + count_merge
def merge(arr, left, mid, right):
i = left
j = mid + 1
temp_list = []
count_merge = 0
while i <= mid and j <= right:
if arr[i] < arr[j]:
temp_list.append(arr[i])
count_merge += arr[i] * (right - j + 1)
i += 1
else:
temp_list.append(arr[j])
j += 1
if i > mid:
temp_list.extend(arr[j:right + 1])
else:
temp_list.extend(arr[i:mid + 1])
for i in range(left, right + 1):
arr[i] = temp_list[i - left]
return count_merge
if __name__ == '__main__':
import random
def get_list(n=10, min_num=0, max_num=10):
return [random.randint(min_num, max_num) for _ in range(n)]
arr_list = get_list(5)
print(arr_list)
count = get_min_sum(arr_list, 0, len(arr_list) - 1)
print(arr_list)
print(count)