时间复杂度为on的排序算法_排序算法amp;时间复杂度计算
對于排序算法而言,有幾個重要的點:
遞推公式(關乎時間復雜度的計算)
遞推公式主要為以下的形式(遞歸使用的復雜度也這么算):
具體推導:
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的遞推公式復雜度計算:
Analysis of Algorithm | Set 4 (Solving Recurrences) - GeeksforGeeks?www.geeksforgeeks.org如何推導的三種方法
2. 遞歸樹(大體思路是使用樹的思想來計算時間復雜度,將每一層的復雜度算出來,然后將所有層的時間復雜度相加)
Recurrence Tree Method3. Master Method(萬能方法,可以直接得到遞歸方程的解,但是只有以下形式可以利用)
Master MethodMerge sort:(
)Binary Search:(
)如果還有不清楚的,可以做一下以下的練習
https://www.csd.uwo.ca/~mmorenom//CS424/Ressources/master.pdf?www.csd.uwo.ca插入排序()
按照順序溫習了一下算法,用Python實現的,格式是按照leetcode寫的。
十大經典排序算法動畫與解析,看我就夠了!(配代碼完全版)-五分鐘學算法?www.cxyxiaowu.com「多圖警告」手撕排序算法 - iOS進階必備?mp.weixin.qq.com個人感覺動畫沒辦法看清楚算法的演變過程,所以是 動畫+示意圖
冒泡排序
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()冒泡排序優化
選擇排序
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] #每次往后面移動一個位置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里面儲存數據的序號largest = i # Initialize largest as root l = 2 * i + 1 # left = 2*i + 1 你是left子節點,也是下一層的父節點 r = 2 * i + 2 # right = 2*i + 2 你是right子節點,也是下一層的父節點heapify使用了一個遞歸方程,主要保證了最大(小)堆一定是滿足條件1,2,3的,用遞歸主要是為了便利所有的節點。
heapsort最奇怪的是for循環是從n-->1,這個算法是一個o(n)的算法,如果是從根節點向下取尋找最大值的話,那么如果最大值在最后的葉子節點,就算找到了最大值,也無法通過交換到根節點,如果是從葉子節點開始便利那么每一個節點的最大值,就會通過二叉樹交換到根節點。
heapsort使用已經建立好的max heap,每次取第一個數字,放到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). 父節點必須大于左右節點(2). 頂層的節點(root)必須是最大的(3). 左邊的節點必須大于右邊的節點(4). 必須是完全二叉樹"""largest = i # Initialize largest as rootl = 2 * i + 1 # left = 2*i + 1 你是left子節點,也是下一層的父節點r = 2 * i + 2 # right = 2*i + 2 你是right子節點,也是下一層的父節點# 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疑問1:heapify為什么是o(nlogn)的算法
疑問2:heapify為什么是不穩定的算法
疑問3:heapify
計數排序
桶排序
基數排序
總結
以上是生活随笔為你收集整理的时间复杂度为on的排序算法_排序算法amp;时间复杂度计算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 统计gitlab代码行脚本_一点也不复杂
- 下一篇: 渗透测试靶机搭建_对vulnhub中An