您好,登錄后才能下訂單哦!
這篇文章主要介紹“python中幾種常用的排序算法”,在日常操作中,相信很多人在python中幾種常用的排序算法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”python中幾種常用的排序算法”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
排序算法的運用非常廣泛。各種語言都有自己內(nèi)置的排序函數(shù),在面試過程中也經(jīng)常會有排序算法的考題。總結(jié)幾種排序算法的實現(xiàn)。
這個問題的顯示表示是:請詳細(xì)描述如何將一組數(shù)字按從小到大的順序排列。
我首先想到的是:
找出數(shù)組中最小的一個;
把這個數(shù)放到另一數(shù)組的最后面;
把這個數(shù)從原來的數(shù)組中剔除;
重復(fù)
重復(fù)的過程通常涉及到遍歷和遞歸,上面這個解法叫「選擇排序」,用 Python 實現(xiàn)如下:
def select_sort(arr): new_arr = [] # 重復(fù) for i in range(len(arr)): small_index = find_smallest(arr) # 把這個數(shù)從原來的數(shù)組中剔除; smallest = arr.pop(small_index) # 把這個數(shù)放到另一數(shù)組的最后面; new_arr.append(smallest) return new_arr def find_smallest(arr): """找出數(shù)組中最小的一個;""" smallest = arr[0] index = 0 for e in range(1,len(arr)): if arr[e] < smallest: smallest = arr[e] index = e return index
可以看出來,代碼實現(xiàn)基本上就是用編程語言寫出解題思路。所以很多編程進(jìn)階書都提到一個解決問題的辦法就是離開鍵盤,去上個廁所,在紙上畫一畫。只要是解題思路很詳細(xì),基本上是可以用來當(dāng)偽代碼使用的,可以全部放入代碼的注釋當(dāng)中。
比較前一個數(shù)和后一個數(shù),如果前比后大,對換他們的位置;
循環(huán)執(zhí)行
def bubble_sort(arr): for i in range(len(arr) - 1): for j in range(len(arr) - i - 1): if arr[j] > arr[j + 1]: tmp = arr[j + 1] arr[j + 1] = arr[j] arr[j] = tmp return arr
上面兩種算法要操作的步驟很多,當(dāng)數(shù)組太多時就會造成性能過低,我們可以想辦法減少要操作的步驟,從而降低算法的復(fù)雜度,提高執(zhí)行效率。減少步驟的很多算法都是將數(shù)據(jù)分成幾部分來處理,也就是通常說的「分治」,從而不斷減少沒部分需要處理的步驟,選擇排序就是這樣一種算法:
1.選出第一個元素
2.遍歷每個元素,也就是從第二個開始拿,如果比第一個元素小,放到一個新數(shù)組里;如果比它大,放到另一個數(shù)組;
3.對兩個新數(shù)組執(zhí)行同樣的操作;
那什么時候不需要執(zhí)行這樣的操作了呢?當(dāng)數(shù)組的元素個數(shù)小于2的時候,不需要比較了,分治策略就結(jié)束。
「分治」是一種非常常見的解題思路。因為它能不斷的將問題變成更簡單的問題,最后變成一個顯而易見的事。也就是說它有兩個條件:
基準(zhǔn)條件。也就是沒有辦法再分了,足夠簡單了。
分治條件或者叫遞歸條件。能夠進(jìn)一步縮小需要解決的問題的規(guī)模。
分治法在算法中非常普遍,不是因為他能降低算法的復(fù)雜度,而是他能一步步將復(fù)雜的問題變得越來越簡單,規(guī)模越來越小,最后變成一個超級簡單的問題,如果能進(jìn)一步抽象這種過程,就能考執(zhí)行同樣的抽象步驟解出來來。分治法經(jīng)常和遞歸用在一起,這就衍生了一種變成方式——函數(shù)式編程,如果能多接觸一些遞歸的案例,對于函數(shù)式變成和抽象是非常有幫助的。軟件設(shè)計就是講一個非常復(fù)雜的問題抽象的過程,所以掌握函數(shù)式編程和遞歸概念對于抽象能力和軟件設(shè)計應(yīng)該是很有幫助的。
下面實現(xiàn)快速排序:
def quick(arr): if len(arr) < 2: return arr else: base = arr[0] less = [i for i in arr[1:] if i < base] greater = [i for i in arr[1:] if i >= base] return quick(less) + [base] + quick(greater)
歸并排序和選擇排序一樣是一種分治遞歸策略:
從中間分成兩組
將兩個已經(jīng)排序好的列表進(jìn)行合并,合并成的列表就是排序好的
那怎么對上述兩個列表排序呢?對兩個列表再執(zhí)行分組策略
什么時候不能繼續(xù)了呢?當(dāng)元素個數(shù)小于 2 的時候
具體實現(xiàn):
def merge_sort(arr): # divide to two if len(arr) < 2: return arr mid = int(len(arr)/2) left = merge_sort(arr[:mid]) right = merge_sort(arr[mid:]) return merge(left, right) def merge(left, right): result = [] j = 0 i = 0 while i < len(left) and j < len(right): if left[i] < right[j]: result.append(left[i]) i += 1 else: result.append(right[j]) j += 1 # add the larger part both left and right result += left[i:] result += right[j:] return result
到此,關(guān)于“python中幾種常用的排序算法”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。