這篇文章主要介紹“python中幾種常用的排序算法”,在日常操作中,相信很多人在python中幾種常用的排序算法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”python中幾種常用的排序算法”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
我們一直強(qiáng)調(diào)成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站對(duì)于企業(yè)的重要性,如果您也覺得重要,那么就需要我們慎重對(duì)待,選擇一個(gè)安全靠譜的網(wǎng)站建設(shè)公司,企業(yè)網(wǎng)站我們建議是要么不做,要么就做好,讓網(wǎng)站能真正成為企業(yè)發(fā)展過程中的有力推手。專業(yè)網(wǎng)站設(shè)計(jì)公司不一定是大公司,創(chuàng)新互聯(lián)作為專業(yè)的網(wǎng)絡(luò)公司選擇我們就是放心。排序算法的運(yùn)用非常廣泛。各種語言都有自己內(nèi)置的排序函數(shù),在面試過程中也經(jīng)常會(huì)有排序算法的考題。總結(jié)幾種排序算法的實(shí)現(xiàn)。
這個(gè)問題的顯示表示是:請(qǐng)?jiān)敿?xì)描述如何將一組數(shù)字按從小到大的順序排列。
我首先想到的是:
找出數(shù)組中最小的一個(gè);
把這個(gè)數(shù)放到另一數(shù)組的最后面;
把這個(gè)數(shù)從原來的數(shù)組中剔除;
重復(fù)
重復(fù)的過程通常涉及到遍歷和遞歸,上面這個(gè)解法叫「選擇排序」,用 Python 實(shí)現(xiàn)如下:
def select_sort(arr): new_arr = [] # 重復(fù) for i in range(len(arr)): small_index = find_smallest(arr) # 把這個(gè)數(shù)從原來的數(shù)組中剔除; smallest = arr.pop(small_index) # 把這個(gè)數(shù)放到另一數(shù)組的最后面; new_arr.append(smallest) return new_arr def find_smallest(arr): """找出數(shù)組中最小的一個(gè);""" smallest = arr[0] index = 0 for e in range(1,len(arr)): if arr[e] < smallest: smallest = arr[e] index = e return index
可以看出來,代碼實(shí)現(xiàn)基本上就是用編程語言寫出解題思路。所以很多編程進(jìn)階書都提到一個(gè)解決問題的辦法就是離開鍵盤,去上個(gè)廁所,在紙上畫一畫。只要是解題思路很詳細(xì),基本上是可以用來當(dāng)偽代碼使用的,可以全部放入代碼的注釋當(dāng)中。
比較前一個(gè)數(shù)和后一個(gè)數(shù),如果前比后大,對(duì)換他們的位置;
循環(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ù)組太多時(shí)就會(huì)造成性能過低,我們可以想辦法減少要操作的步驟,從而降低算法的復(fù)雜度,提高執(zhí)行效率。減少步驟的很多算法都是將數(shù)據(jù)分成幾部分來處理,也就是通常說的「分治」,從而不斷減少?zèng)]部分需要處理的步驟,選擇排序就是這樣一種算法:
1.選出第一個(gè)元素
2.遍歷每個(gè)元素,也就是從第二個(gè)開始拿,如果比第一個(gè)元素小,放到一個(gè)新數(shù)組里;如果比它大,放到另一個(gè)數(shù)組;
3.對(duì)兩個(gè)新數(shù)組執(zhí)行同樣的操作;
那什么時(shí)候不需要執(zhí)行這樣的操作了呢?當(dāng)數(shù)組的元素個(gè)數(shù)小于2的時(shí)候,不需要比較了,分治策略就結(jié)束。
「分治」是一種非常常見的解題思路。因?yàn)樗懿粩嗟膶栴}變成更簡單的問題,最后變成一個(gè)顯而易見的事。也就是說它有兩個(gè)條件:
基準(zhǔn)條件。也就是沒有辦法再分了,足夠簡單了。
分治條件或者叫遞歸條件。能夠進(jìn)一步縮小需要解決的問題的規(guī)模。
分治法在算法中非常普遍,不是因?yàn)樗芙档退惴ǖ膹?fù)雜度,而是他能一步步將復(fù)雜的問題變得越來越簡單,規(guī)模越來越小,最后變成一個(gè)超級(jí)簡單的問題,如果能進(jìn)一步抽象這種過程,就能考執(zhí)行同樣的抽象步驟解出來來。分治法經(jīng)常和遞歸用在一起,這就衍生了一種變成方式——函數(shù)式編程,如果能多接觸一些遞歸的案例,對(duì)于函數(shù)式變成和抽象是非常有幫助的。軟件設(shè)計(jì)就是講一個(gè)非常復(fù)雜的問題抽象的過程,所以掌握函數(shù)式編程和遞歸概念對(duì)于抽象能力和軟件設(shè)計(jì)應(yīng)該是很有幫助的。
下面實(shí)現(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)
歸并排序和選擇排序一樣是一種分治遞歸策略:
從中間分成兩組
將兩個(gè)已經(jīng)排序好的列表進(jìn)行合并,合并成的列表就是排序好的
那怎么對(duì)上述兩個(gè)列表排序呢?對(duì)兩個(gè)列表再執(zhí)行分組策略
什么時(shí)候不能繼續(xù)了呢?當(dāng)元素個(gè)數(shù)小于 2 的時(shí)候
具體實(shí)現(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é)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!