最小的k個數
輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。
思路:可以先利用排序演算法進行排序,然後取出k個最小的數。排序演算法有冒泡、選擇、堆排序、歸併、快排等,為了練習這種排序演算法,我們用這些演算法一一求解本題。
class
solution
:def
getleastnumbers_solution
(self, tinput, k)
:# write code here
if k >
len(tinput)
or k <0:
return
#堆排序
#建立最大堆
defmax_heap
(tinput,start,end)
: root = start
while
true
: child = root *2+
1if child > end:
break
if child +
1<= end and tinput[child]
<= tinput[child+1]
: child = child +
1if tinput[child]
> tinput[root]
: tinput[child]
,tinput[root]
= tinput[root]
,tinput[child]
root = child
else
:break
#堆調整
defadjust_heap
(tinput)
: n =
len(tinput)//2
-1for start in
range
(n,-1,
-1):
max_heap(tinput,start,
len(tinput)-1
)for end in
range
(len
(tinput)-1
,0,-
1): tinput[end]
,tinput[0]
= tinput[0]
,tinput[end]
max_heap(tinput,
0,end-1)
return tinput
nums = adjust_heap(tinput)
return nums[
:k]
#氣泡排序
''' if k > len(tinput) or k < 0:
return
for i in range(len(tinput)-1):
for j in range(len(tinput)-i-1):
if tinput[j]>tinput[j+1]:
tinput[j],tinput[j+1] = tinput[j+1],tinput[j]
return tinput[:k]
'''
# 選擇排序
""" if k > len(tinput) or k < 0:
return
for i in range(len(tinput)):
min = i
for j in range(i+1,len(tinput)): #尋找最小元素的下表
if tinput[j] < tinput[min]:
min = j
tinput[min],tinput[i] = tinput[i],tinput[min] #交換
return tinput[:k]
"""
# 快排序,利用雙指標從左右兩個方向進行滑動,把小於基準值的元素放在左邊,大於的放在右邊,記錄中間元素的值,然後再和基準值進行調換位置
class
solution
:def
getleastnumbers_solution
(self, tinput, k)
:# write code here
if k >
len(tinput)
or k <0:
return
#快排序
defpatition
(a,low,high)
: i = low
j = high
x = a[low]
while i < j:
while
(i>=x)
: j -=
1while
(i<=x)
: i +=
1if i != j:
a[i]
,a[j]
= a[j]
,a[i]
a[low]
,a[i]
= a[i]
,a[low]
return i
defquicksort
(a,low,high)
:if low < high:
i = patition(a,low,high)
quicksort(a,low,i-1)
quicksort(a,i+
1,high)
return a
a = quicksort(tinput,0,
len(tinput)-1
)return a[
:k]
#歸併排序:不斷劃分陣列,直到每個陣列只有乙個元素,然後進行合併。
class
solution
:def
getleastnumbers_solution
(self, tinput, k)
:# write code here
if k >
len(tinput)
or k <0:
return
#歸併排序
defmerge
(left,right)
: result =
i,j =0,
0while i<
len(left)
and j<
len(right)
:if left[i]
i +=
1else:)
j +=
1while i !=
len(left):)
i +=
1while j !=
len(right):)
j +=
1return result
defmergesort
(nums):if
len(nums)
<2:
return nums
else
: middle =
len(nums)//2
left = mergesort(nums[
:middle]
) right = mergesort(nums[middle:])
return merge(left,right)
a = mergesort(tinput)
return a[
:k]
劍指offer 最小k個數
1.題目 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,2.方法 1 基於堆排序演算法,構建最大堆。時間複雜度為o nlogk 2 如果用快速排序,時間複雜度為o nlogn 3 如果用插入排序,時間複雜度為o n 2 3.演...
劍指offer 最小的K個數
華電北風吹 天津大學認知計算與應用重點實驗室 日期 2015 10 4 題目描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,解析 基於插入排序的思想可以想到使用乙個長度為k的排序陣列儲存最小的k個元素,複雜度o nk 基於...
《劍指offer》最小的K個數
輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,輸入給整數陣列,和k 找出其中最小的k個數 class solution 1 先用插入排序對陣列中數進行排序。2 取出有序陣列中最小的kge。附 這只是乙個比較簡單的方法。如果考慮...