def
main
(arr)
:#主函式
ifnot arr or
len(arr)
<2:
return arr
return partition(arr,0,
len(arr)-1
)#分defpartition
(arr,l,r)
:#base case
if l==r:
return
mid = l+
(r-l)//2
left_arr = partition(arr,l,mid)
right_arr = partition(arr,mid+
1,r)
all_arr = merge(arr,l,mid,r)
return all_arr
#合def
merge
(arr,l,mid,r)
: left = l
right = mid+
1#res用來存排好序的結果
res =
while left<=mid and right<=r:
if arr[left]
<=arr[right]:)
left+=
1else:)
right+=
1#把餘下的複製過來,並且改變一下原有陣列
while left<=mid:
) left +=
1while right<= r:
) right +=
1#將res中排好序的結果整理到arr陣列中並返回
for i in
range
(l,r+1)
: arr[i]
= res.pop(0)
return arr
if __name__ ==
'__main__'
: arr =[1
,3,4
,2,5
]print
(main(arr)
)
def
main
(arr)
:#主函式
ifnot arr or
len(arr)
<2:
return
return partition(arr,0,
len(arr)-1
)#分defpartition
(arr,l,r)
:#base case
if l==r:
return
0 mid = l+
(r-l)//2
left_arr = partition(arr,l,mid)
right_arr = partition(arr,mid+
1,r)
all_arr = merge(arr,l,mid,r)
return left_arr + right_arr + all_arr
#合def
merge
(arr,l,mid,r)
: left = l
right = mid+
1#res用來存排好序的結果
res =
#sum 用來統計小和
sum=
0while left<=mid and right<=r:
if arr[left]
:sum
+= arr[left]
*(r-right+1)
) left+=
1else:)
right+=
1#把餘下的複製過來,並且改變一下原有陣列
while left<=mid:
) left +=
1while right<= r:
) right +=
1#將res中排好序的結果整理到arr陣列中並返回
#for i in range(l,r+1):
#arr[i] = res.pop(0)
return
sumif __name__ ==
'__main__'
: arr =[1
,3,4
,2,5
]print
(main(arr)
)
#逆序對
defmain
(arr)
:#主函式
ifnot arr or
len(arr)
<2:
return
none
return partition(arr,0,
len(arr)-1
)#分defpartition
(arr,l,r)
:#base case
if l==r:
return
mid = l+
(r-l)//2
left_arr = partition(arr,l,mid)
right_arr = partition(arr,mid+
1,r)
all_arr = merge(arr,l,mid,r)
return left_arr + right_arr + all_arr
#合def
merge
(arr,l,mid,r)
: left = l
right = mid+
1#res用來存排好序的結果
helper =
#sum 用來存放逆序對
res =
while left<=mid and right<=r:
if arr[left]
>arr[right]:)
for i in
range
(right,r+1)
:[arr[left]
,arr[i]
])
left+=
1else:)
right+=
1#把餘下的複製過來,並且改變一下原有陣列
while left<=mid:
) left +=
1while right<= r:
) right +=
1for i in
range
(l,r+1)
: arr[i]
= helper.pop(0)
return res
if __name__ ==
'__main__'
: arr =[7
,5,6
,4]print
(len
(main(arr)
))
歸併排序 小和問題 逆序對
引言 求小和問題 在隨機元素,隨機數組大小的陣列中,找出左邊比右邊元素小的所有元素之和。例如 陣列 4,2,5,1,7,3,6 第乙個元素4比2大,不算小和,5比4和2都大,那就是4 2 6 1比4和2和5都小,不算小和 7比前面的都大,那就是上次小和6 4 2 5 1 18 然後3前面比2和1大,...
經典排序演算法 堆排序(逆序)
構建小頂堆 將堆頂元素與最後乙個元素交換並減小陣列範圍 對交換完的陣列進行向下調整 整體時間複雜度o nlog n public class heapsort 構建小頂堆 public static void minheap int a,int n 小頂堆的向下調整 public static vo...
小和問題和逆序對問題
在乙個陣列中,每乙個數左邊比當前數小的數累加起來,叫做這個陣列的小和。求乙個陣列的小和。例如 對於陣列 1,3,4,2,5 1左邊比1小的數,沒有 3左邊比3小的數,1 4左邊比4小的數,1 3 2左邊比2小的數,1 5左邊比5小的數,1 3 4 2 所以小和為1 1 3 1 1 3 4 2 16 ...