python 堆排序 小和問題 逆序對

2021-10-08 19:41:30 字數 3474 閱讀 6527

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