乙個中位數是它所屬集合的中點元素
9.1.1 在乙個有n個元素的集合中,需要做多少次比較才能確定其最小元素呢
9.1.2 同時找到最小值和最大值
**實現: 同時求解最大值和最小值
123
4567
891011
1213
1415
1617
1819
2021
2223
2425
26
def minimum_and_maximum(arr):
arr_len = len(arr)
print(arr_len)
if arr_len == 0:
raise indexerror("param: arr is empty")
if arr_len % 2:
max_val, min_val = arr[0], arr[0]
start = 1
else:
max_val, min_val = (arr[0], arr[1]) if (arr[0] > arr[1]) else (arr[1], arr[0])
start = 2
for i in range(start, arr_len, 2):
temp_max, temp_min = (arr[i], arr[i + 1]) if (arr[i] > arr[i + 1]) else (arr[i + 1], arr[i])
if temp_max > max_val:
max_val = temp_max
if temp_min < min_val:
min_val = temp_min
return max_val, min_val
if __name__ == '__main__':
arr = [-3, 19, -2, 4, 1, 3, 2, 16, 9, 10, 14, 8, 7, 17, 0, -1, 18]
max_val, min_val = minimum_and_maximum(arr)
print(max_val, min_val)
平均情況
9.3.1 簡介
9.3.2 演算法步驟
將輸入陣列的n個元素劃分為floor(n / 5)
組,每組有5個元素,且至多只有一組由剩下的n % 5
個元素組成
尋找這ceil(n / 5)
組中每一組的中位數: 首先對每組元素進行插入排序, 然後確定每組有序元素的中位數
對第二步中找到的ceil(n / 5)
個中位數,遞迴呼叫select
以找出其中位數x
通過partition
函式按照x
對輸入陣列進行劃分, 假設x
是陣列的第k
個順序統計量
如果i=k
,則返回x
; 如果ik
,則在高區遞迴查詢第i-k
小的元素
9.3.3 演算法實現:python
123
4567
891011
1213
1415
1617
1819
2021
2223
2425
2627
2829
3031
3233
3435
3637
3839
4041
4243
4445
4647
4849
5051
5253
5455
5657
5859
6061
6263
6465
6667
6869
7071
72
import math
import random
def divide_arr(arr, start, end):
labels = [i for i in range(start, end, 5)]
if end != start[-1]:
return labels
def find_median(arr, labels):
for i in range(0, len(labels) - 1):
insertion_sort(arr, labels[i], labels[i + 1])
medians =
for i in range(0, len(labels) - 1):
return medians
def insertion_sort(arr, start, end):
if start >= end + 1:
return
for i in range(start + 1, end):
key = arr[i]
j = i - 1
while j > start - 1 and arr[j] > key:
arr[j + 1] = arr[j]
j -= 1
arr[j + 1] = key
def select(arr, start, end, i):
if start == end - 1:
return arr[start]
elif start > end - 1:
return arr[end - 1]
else:
labels = divide_arr(arr, start, end)
medians = find_median(arr, labels)
x = select(medians, 0, len(medians), math.floor((len(medians)-1) / 2))
o = partition(arr, start, end, x)
if o + 1 - start == i:
return arr[o]
elif o + 1 - start < i:
return select(arr, o + 1, end, i - (o + 1 - start))
else:
return select(arr, start, o, i)
def partition(arr, p, r, x):
i = p - 1
n = i
for j in range(p, r):
if arr[j] <= x:
i += 1
arr[i], arr[j] = arr[j], arr[i]
if arr[i] == x:
n = i
arr[i], arr[n] = arr[n], arr[i]
return i
if __name__ == "__main__":
for i in range(1, 11):
print()
arr = [8, 9, 3, 5, 4, 1, 7, 2, 0, 6]
print(arr)
o = select(arr, 0, len(arr), i)
print(arr)
print(o)
9.3.4 時間複雜度
演算法導論 中位數和順序統計量
在乙個由n個元素組成的集合中,第i個順序統計量是該集合中第i小的元素。乙個中位數是它所屬集合的 中點元素 當n為奇數時,中位數是唯一的,位於i n 1 2處 當n為偶數時,存在兩個中位數,分別位於i n 2和i n 2 1處。如果不考慮n的奇偶性,中位數總是出現在i n 1 2 處 下中位數 和i ...
《演算法導論》學習分享 9 中位數和順序統計量
順序統計量,第i個順序統計量指n個元素集合中第i小的元素。最小值,第1個順序統計量。最大值,第n個順序統計量。中位數,第n 2個順序統計量。若n為偶數,取n 2 1 我們可以通過一次遍歷陣列,取得最大值或者最小值。但是若要取得中位數或者其他順序統計量,則沒辦法通過一次遍歷陣列得到。如果將陣列排序,將...
演算法導論筆記 09中位數和順序統計量
1 n個元素組成的集合,第 i個順序統計量,就是該集合中第 i小的元素。所以,集合中的最小值就是第1個順序統計量,最大值就是第n個順序統計量。中位數是所屬集合的 中點元素 當n是奇數的時候,中位數唯一,位於 n 1 2處。如果n是偶數,中位數有兩個,分別位於n 2和 n 2 1。2 選擇問題,就是選...