直通BAT面試演算法精講 排序(1)

2021-08-21 10:57:21 字數 3387 閱讀 6339

注:

所有的**都是用python實現的,都是自己寫的,可能有些地方不太完善

時間複雜度:o(n^2)

空間複雜度:o(1)

思想:依次訪問元素,逆序就置換。一趟排序後最大(小)的被置換到最後

def

bubble_sort

(arr,n):

ifnot arr:

return

none

for i in range(n):

for j in range(n-i-1):

if arr[j] > arr[j+1]:

arr[j],arr[j+1] = arr[j+1],arr[j]

return arr

時間複雜度:o(n^2)

空間複雜度:o(1)

思想:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。

def

select_sort

(arr,n):

for i in range(n):

min = i

for j in range(i+1,n):

if arr[j]return arr

時間複雜度:o(n^2)

空間複雜度:o(1)

#直接插入排序

definsert_sort

(arr,n):

for i in range(n):

x = arr[i]

j = i-1

while j>=0:

if x1] = arr[j]

else:

break

j -= 1

arr[j+1] = x

return arr

#折半插入排序

defhalf_insert_sort

(arr,n):

for i in range(1,n):

if arr[i-1]>arr[i]:

temp = arr[i]

low = 0

high = i-1

while low<=high:

mid = (low+high) // 2

if arr[mid] < temp:

low += 1

else:

high -= 1

j = i

while j>=low:

arr[j] = arr[j-1]

j -= 1

arr[low] = temp

return arr

時間複雜度:o(nlogn)

空間複雜度:o(n)

def merge_sort(arr):

ifnot arr or

len(arr)<2:

return arr

mid = len(arr)//2

left = merge_sort(arr[:mid])

right = merge_sort(arr[mid:])

return

merge(left,right)

def merge(left,right):

i,j = 0,0

result =

while iif left[i] < right[j]:

i += 1

else:

j += 1

if iresult.extend(left[i:])

if jresult.extend(right[j:])

return

result

時間複雜度:o(nlogn)

空間複雜度:o(nlongn)~o(n)

def

quicksort

(arr):

ifnot arr:

return

quick_sort(arr,0,len(arr)-1)

return arr

defquick_sort

(arr,left,right):

if left1)

quick_sort(arr,i+1,right)

defpartition

(array, left, right):

x = array[right]

i = left - 1

for j in range(left, right):

if array[j] <= x:

i += 1

array[i], array[j] = array[j], array[i]

array[i + 1], array[right] = array[right], array[i+1]

return i + 1

時間複雜度:o(nlogn)

空間複雜度:o(nlogn)

def

heap_sort

(arr):

n = len(arr)

for i in range(n//2-1,-1,-1):

fixdown(arr,i,n)

for i in range(n-1,-1,-1):

arr[0],arr[i] = arr[i],arr[0]

fixdown(arr,0,i)

return arr

deffixdown

(arr,i,n):

while (2*i+1)2*i+1

if j+1

and arr[j]1]:

j += 1

if arr[j] <= arr[i]:

break

else:

arr[i],arr[j] = arr[j],arr[i]

i = j

時間複雜度:o(nlogn)

空間複雜度:o(1)

def

shell_sort

(arr):

step = len(arr)

while step>1:

step = step//2

for i in range(len(arr)):

j = i

while j>0:

if arr[j-step]>arr[j]:

arr[j-step],arr[j] = arr[j],arr[j-step]

else:

break

j -= step

return arr

直通BAT面試演算法精講 排序(4)

荷蘭國旗問題 三色排序問題 對只包含0,1,2的整數陣列進行排序,要求使用交換 原地排序,而不是利用計數進行排序,做到0全在陣列左邊,1在中間,2在右邊 本題主要過程和快排劃分過程類似 測試用例 arr 1,1,0,0,2,1,1,0 輸出 0,0,0,1,1,1,1,2 解題思路 在陣列左側設定乙...

直通BAT面試演算法精講 鍊錶(1)

鍊錶問題知識點和注意事項 1.鍊錶問題演算法難度不高,但考察 實現能力。2.鍊錶和陣列都是一種線性結構,陣列是一段連續的儲存空間,鍊錶空間不一定保證連續,是臨時分配的 鍊錶問題 實現關鍵點 1.鍊錶調整函式的返回值,型別要求往往是節點型別。2.處理鍊錶過程中,先採用畫圖的方式理清邏輯。3.鍊錶問題對...

直通BAT面試演算法精講課1

1.有一棵二叉樹,請設計乙個演算法,按照層次列印這棵二叉樹。給定二叉樹的根結點root,請返回列印結果,結果按照每一層乙個陣列進行儲存,所有陣列的順序按照層數從上往下,且每一層的陣列內元素按照從左往右排列。保證結點數小於等於500。struct treenode class treeprinter ...