时间复杂度为on的排序算法_排序算法amp;时间复杂度计算
對(duì)于排序算法而言,有幾個(gè)重要的點(diǎn):
遞推公式(關(guān)乎時(shí)間復(fù)雜度的計(jì)算)
遞推公式主要為以下的形式(遞歸使用的復(fù)雜度也這么算):
具體推導(dǎo):
https://jeffe.cs.illinois.edu/teaching/algorithms/notes/99-recurrences.pdf?jeffe.cs.illinois.eduhttps://www.cs.ucdavis.edu/~gusfield/cs222f07/mastermethod.pdf?www.cs.ucdavis.edu公式1的遞推公式復(fù)雜度計(jì)算:
Analysis of Algorithm | Set 4 (Solving Recurrences) - GeeksforGeeks?www.geeksforgeeks.org如何推導(dǎo)的三種方法
2. 遞歸樹(大體思路是使用樹的思想來(lái)計(jì)算時(shí)間復(fù)雜度,將每一層的復(fù)雜度算出來(lái),然后將所有層的時(shí)間復(fù)雜度相加)
Recurrence Tree Method3. Master Method(萬(wàn)能方法,可以直接得到遞歸方程的解,但是只有以下形式可以利用)
Master MethodMerge sort:(
)Binary Search:(
)如果還有不清楚的,可以做一下以下的練習(xí)
https://www.csd.uwo.ca/~mmorenom//CS424/Ressources/master.pdf?www.csd.uwo.ca插入排序()
按照順序溫習(xí)了一下算法,用Python實(shí)現(xiàn)的,格式是按照l(shuí)eetcode寫的。
十大經(jīng)典排序算法動(dòng)畫與解析,看我就夠了!(配代碼完全版)-五分鐘學(xué)算法?www.cxyxiaowu.com「多圖警告」手撕排序算法 - iOS進(jìn)階必備?mp.weixin.qq.com個(gè)人感覺(jué)動(dòng)畫沒(méi)辦法看清楚算法的演變過(guò)程,所以是 動(dòng)畫+示意圖
冒泡排序
class Solution:def bubble_sort(self, my_list):for i in range(1, len(my_list)):for j in range(i):if my_list[i] < my_list[j]:buble = my_list[i]my_list[i] = my_list[j]my_list[j] = bublereturn my_listdef main():my_list = [9,2,3,8,5,7,4,6,1]test = Solution()results = test.bubble_sort(my_list)print(results)if __name__ == '__main__':main()冒泡排序優(yōu)化
選擇排序
class Solution:def selection_sort(self, my_list):for i in range(len(my_list)):selection_min = i# 找到最小的for j in range(i + 1, len(my_list)):if my_list[j] < my_list[selection_min]:selection_min = j# 交換exchange_num = my_list[selection_min]my_list[selection_min] = my_list[i]my_list[i] = exchange_numreturn my_listdef main():my_list = [9,2,3,8,5,7,4,6,1]test = Solution()results = test.selection_sort(my_list)print(results)if __name__ == '__main__':main()插入排序
Python 插入排序 | 菜鳥教程?www.runoob.comclass Solution:def insert_sort(self, arr): for i in range(1, len(arr)): key = arr[i] j = i-1while j >=0 and key < arr[j] : arr[j+1] = arr[j] #每次往后面移動(dòng)一個(gè)位置j -= 1arr[j+1] = key # 交換return arrdef main():my_list = [9,2,3,8,5,7,4,6,1]test = Solution()results = test.insert_sort(my_list)print(results)歸并排序
歸并排序
堆排序
list = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2]
紅色:list里面儲(chǔ)存數(shù)據(jù)的序號(hào)largest = i # Initialize largest as root l = 2 * i + 1 # left = 2*i + 1 你是left子節(jié)點(diǎn),也是下一層的父節(jié)點(diǎn) r = 2 * i + 2 # right = 2*i + 2 你是right子節(jié)點(diǎn),也是下一層的父節(jié)點(diǎn)heapify使用了一個(gè)遞歸方程,主要保證了最大(小)堆一定是滿足條件1,2,3的,用遞歸主要是為了便利所有的節(jié)點(diǎn)。
heapsort最奇怪的是for循環(huán)是從n-->1,這個(gè)算法是一個(gè)o(n)的算法,如果是從根節(jié)點(diǎn)向下取尋找最大值的話,那么如果最大值在最后的葉子節(jié)點(diǎn),就算找到了最大值,也無(wú)法通過(guò)交換到根節(jié)點(diǎn),如果是從葉子節(jié)點(diǎn)開始便利那么每一個(gè)節(jié)點(diǎn)的最大值,就會(huì)通過(guò)二叉樹交換到根節(jié)點(diǎn)。
heapsort使用已經(jīng)建立好的max heap,每次取第一個(gè)數(shù)字,放到List最后面。然后重新heapfiy
# Python program for implementation of heap Sort# To heapify subtree rooted at index i. # n is size of heap def heapify(arr, n, i):"""max heap(1). 父節(jié)點(diǎn)必須大于左右節(jié)點(diǎn)(2). 頂層的節(jié)點(diǎn)(root)必須是最大的(3). 左邊的節(jié)點(diǎn)必須大于右邊的節(jié)點(diǎn)(4). 必須是完全二叉樹"""largest = i # Initialize largest as rootl = 2 * i + 1 # left = 2*i + 1 你是left子節(jié)點(diǎn),也是下一層的父節(jié)點(diǎn)r = 2 * i + 2 # right = 2*i + 2 你是right子節(jié)點(diǎn),也是下一層的父節(jié)點(diǎn)# See if left child of root exists and is# greater than rootif l < n and arr[i] < arr[l]:largest = l# See if right child of root exists and is# greater than rootif r < n and arr[largest] < arr[r]:largest = r# Change root, if neededif largest != i:arr[i],arr[largest] = arr[largest],arr[i] # swap# Heapify the root.heapify(arr, n, largest)# The main function to sort an array of given size def heapSort(arr):n = len(arr)# Build a maxheap.for i in range(n//2, -1, -1):heapify(arr, n, i)# One by one extract elementsfor i in range(n-1, 0, -1):arr[i], arr[0] = arr[0], arr[i] # swapheapify(arr, i, 0)# Driver code to test above arr = [ 12, 11, 13, 7, 5, 6, 18] heapSort(arr) # n = len(arr) print(arr) # This code is contributed by Mohit Kumra疑問(wèn)1:heapify為什么是o(nlogn)的算法
疑問(wèn)2:heapify為什么是不穩(wěn)定的算法
疑問(wèn)3:heapify
計(jì)數(shù)排序
桶排序
基數(shù)排序
總結(jié)
以上是生活随笔為你收集整理的时间复杂度为on的排序算法_排序算法amp;时间复杂度计算的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 统计gitlab代码行脚本_一点也不复杂
- 下一篇: 数据结构稀疏矩阵的加法十字链表_学习数据