日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

时间复杂度为on的排序算法_排序算法amp;时间复杂度计算

發(fā)布時(shí)間:2025/3/19 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 时间复杂度为on的排序算法_排序算法amp;时间复杂度计算 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

對(duì)于排序算法而言,有幾個(gè)重要的點(diǎn):

  • 理解此種排序算法是怎么運(yùn)行的
  • 理解算法的時(shí)間復(fù)雜度與空間復(fù)雜度計(jì)算
  • 遞推公式(關(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)的三種方法

  • Substitution Method
  • Substitution Method

    2. 遞歸樹(大體思路是使用樹的思想來(lái)計(jì)算時(shí)間復(fù)雜度,將每一層的復(fù)雜度算出來(lái),然后將所有層的時(shí)間復(fù)雜度相加)

    Recurrence Tree Method

    3. Master Method(萬(wàn)能方法,可以直接得到遞歸方程的解,但是只有以下形式可以利用)

    Master Method

    Merge 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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。