劍指offer 13 最小的k個數

2021-10-04 23:29:00 字數 3893 閱讀 4578

最小的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。附 這只是乙個比較簡單的方法。如果考慮...