欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

python快排庫(kù)函數(shù) python快速排序函數(shù)

為什么python內(nèi)置的sort比自己寫的快速排序快100倍?

主要原因,內(nèi)置函數(shù)用C寫的。在Python語(yǔ)言內(nèi)無(wú)論如何造不出內(nèi)置函數(shù)的輪子。這也是通常C跟C++語(yǔ)言用戶更喜歡造基礎(chǔ)算法的輪了的原因。因?yàn)镃/C++用戶真有條件寫出匹敵標(biāo)準(zhǔn)庫(kù)的算法,但很多高級(jí)語(yǔ)言不行,不是程序員技術(shù)差,是客觀條件就根本做不到。

創(chuàng)新互聯(lián)制作網(wǎng)站網(wǎng)頁(yè)找三站合一網(wǎng)站制作公司,專注于網(wǎng)頁(yè)設(shè)計(jì),成都網(wǎng)站建設(shè)、網(wǎng)站制作,網(wǎng)站設(shè)計(jì),企業(yè)網(wǎng)站搭建,網(wǎng)站開發(fā),建網(wǎng)站業(yè)務(wù),680元做網(wǎng)站,已為千余家服務(wù),創(chuàng)新互聯(lián)網(wǎng)站建設(shè)將一如既往的為我們的客戶提供最優(yōu)質(zhì)的網(wǎng)站建設(shè)、網(wǎng)絡(luò)營(yíng)銷推廣服務(wù)!

你比如說(shuō)Java語(yǔ)言沒(méi)人造字符串的輪子,C++光一個(gè)字符串類就有無(wú)數(shù)多的實(shí)現(xiàn)。是因?yàn)镃+用戶更喜歡寫字符串類嗎?顯然不是,一方面是因?yàn)镴ava語(yǔ)言內(nèi)沒(méi)法造出匹敵Java內(nèi)置標(biāo)準(zhǔn)庫(kù)算法的輪子,而C++真的可以,另外一個(gè)比較慘的原因是C++標(biāo)準(zhǔn)庫(kù)的字符串功能太弱了,大多數(shù)高級(jí)語(yǔ)言的字符串類功能都比C+標(biāo)準(zhǔn)庫(kù)字符串類功能更強(qiáng)。

寫C++的時(shí)候一大錯(cuò)覺(jué)就是我覺(jué)著我能比標(biāo)準(zhǔn)庫(kù)還快,同樣的道理放在Python里面也同樣適用,不管是Python各種常用package或內(nèi)建函數(shù),基本上都針對(duì)實(shí)用場(chǎng)景作了優(yōu)化,自己手寫的算法一般是比不上內(nèi)建算法效率的,這也是為什么用Python時(shí)不鼓勵(lì)自己造輪子的原因。

回到這個(gè)問(wèn)題,Python內(nèi)建的sort本質(zhì)上為C實(shí)現(xiàn)的函數(shù),本身執(zhí)行效率就會(huì)比Python快很多,并且會(huì)根據(jù)不同的數(shù)據(jù)規(guī)模采用不同的排序算法,故效率一般都會(huì)優(yōu)于自己在Python里面手寫的排序更何況題主寫的是基于遞歸的quicksort9,額外時(shí)間開銷大。

因?yàn)閜ython內(nèi)置的sort是用c語(yǔ)言寫的,如果你用c語(yǔ)言或者c++寫的話肯定是可以做到一樣快的至于為什么python計(jì)算效率比c語(yǔ)言能慢100倍這個(gè)具體的原理我不清楚,不過(guò)鑒于知乎上已經(jīng)有很多大佬解釋過(guò)這個(gè)問(wèn)題,我就不在這里班門弄斧了

還有底下扯timsort的,快排序是所有比較排序算法里平均性能最優(yōu)的一族算法,像C++和rust里的unstable_sort都是用的快排序。可能在一些情況下,比如數(shù)組幾乎有序時(shí),timsort會(huì)比快排序快。但是你隨便給一個(gè)數(shù)組,比如像題主那樣隨機(jī)一個(gè)一百萬(wàn)大小的數(shù)然后排序,timsort是絕對(duì)不可能比快排序快的。絕對(duì)不可能。快的這100倍和timsort屁關(guān)系都沒(méi)有。

我是C/C++程序員,我可以很負(fù)責(zé)的告訴你,在用天下現(xiàn)有所有高級(jí)語(yǔ)言進(jìn)行排序的問(wèn)題上,C要是認(rèn)了第二,則沒(méi)人敢認(rèn)第一。所以,我猜,Python以及好多其他高級(jí)語(yǔ)言,都會(huì)時(shí)不時(shí)直接上C語(yǔ)言寫的靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)。我自己也造了不少輪子,有部分是因?yàn)閯倓偲鸩剑瑢?duì)系統(tǒng)API和函數(shù)庫(kù)不熟悉,找不到適合的,所以自己造輪子,后來(lái)發(fā)現(xiàn)了有更好的,我把我寫的拋棄了。但這里也不排除有一部分是因?yàn)槲覀€(gè)人覺(jué)得還有優(yōu)化的空間,所以自己用C語(yǔ)言重新造了一個(gè)輪子,這樣效率比現(xiàn)成的更優(yōu)。

所以說(shuō),要論高級(jí)語(yǔ)言的鼻祖,還真非C莫屬,從執(zhí)行效率上講,別說(shuō)python,JAVA,C#,VB,甚至C的親兒子C++,在同一個(gè)程序員手中,都沒(méi)法與C抗衡,所以說(shuō),這些語(yǔ)言都是排著隊(duì)等著被C吊打的,也正因?yàn)槿绱耍裕駊ython這類高級(jí)語(yǔ)言,有自帶函數(shù)可用的,最好別想著自己重新造輪子,因?yàn)槟悴豢赡茉斐霰茸詭Ш瘮?shù)更快的輪子。

內(nèi)置庫(kù)函數(shù)都是用C實(shí)現(xiàn)的,肯定要比手寫的Python程序執(zhí)行效率更高,此外內(nèi)置排序Timsort相比本科課程上學(xué)的時(shí)間復(fù)雜度為Onlogn的排序算法做了很多常數(shù)優(yōu)化,所以對(duì)于普通人而言,不要希望純手寫出來(lái)的東西效率能和標(biāo)準(zhǔn)庫(kù)相當(dāng)了。另外,題主寫的排序是過(guò)不了LeetCode上的裸排序題目的,隨機(jī)選取pivot對(duì)于快速排序是最基本的優(yōu)化雖然題主排的是隨機(jī)數(shù),現(xiàn)在這么選肯定不是效率低的主要原因。

所以說(shuō)了,py幾乎得把自己的循環(huán)體拆了,這就是py和c/c++的性能差距,必須盡量用內(nèi)置函數(shù)和numpy來(lái)處理數(shù)據(jù),一旦手寫循環(huán)體。,那你就得知道這可能得慢百倍,像用opency的py版時(shí)你不小心寫個(gè)雙循環(huán)來(lái)處理數(shù)據(jù),那酸爽,而cppc#搞opencv就能隨意用指針來(lái)寫循環(huán),這也是為啥他們其實(shí)不需要numpy這種組件,自身就有足夠的性能和靈活度來(lái)處理這個(gè)。

Cpp內(nèi)置的排序是快排和堆排的結(jié)合,最壞時(shí)間復(fù)雜度為nlogn,而快排最壞是n2。至于python內(nèi)部的排序,我認(rèn)為是一個(gè)道理,不會(huì)簡(jiǎn)簡(jiǎn)單單是一個(gè)快排,舉個(gè)簡(jiǎn)單例子,當(dāng)你數(shù)據(jù)已經(jīng)是有序的時(shí)候,再傳入快排肯定就不合適。那你設(shè)置排序函數(shù)的時(shí)候,是不是預(yù)先將他打亂,再進(jìn)行快排會(huì)更好呢。當(dāng)然具體不會(huì)這么簡(jiǎn)單,只是我認(rèn)為官方給的接口都是很精妙的,很值得學(xué)習(xí)。

一方面Python中sort函數(shù)是用C語(yǔ)言寫的,C++內(nèi)部的sort是由快排,直接插入和堆排序混合的,當(dāng)數(shù)據(jù)量比較大的時(shí)候先用的快排,當(dāng)數(shù)據(jù)量小的時(shí)候用直接插入,因?yàn)楫?dāng)數(shù)據(jù)量變小時(shí),快排中的每個(gè)部分基本有序,接近直接插入的最好情況的時(shí)間復(fù)雜度O(n),就比快排要好一點(diǎn)了。

另外一方面這個(gè)的底層實(shí)現(xiàn)就是歸并排序。,只是使用了Python無(wú)法編寫的底層實(shí)現(xiàn),從而避免了Python本身附加的大量開銷,速度比我們自己寫的歸并排序要快很多,所以說(shuō)我們一般排序都盡量使用sorted和sort。

python 內(nèi)置排序函數(shù)使用

python內(nèi)置關(guān)于排序的工具主要有兩個(gè)一個(gè)是列表自帶的 sort() 方法,另外一個(gè)是 sorted() 函數(shù)。Python 列表內(nèi)置方法可以直接修改列表。而 sorted() 內(nèi)置函數(shù)從一個(gè)可迭代對(duì)象(列表,元組等都可以)構(gòu)建一個(gè)新的排序列表。其函數(shù)原型分別如下:

對(duì)列表進(jìn)行默認(rèn)排序

從函數(shù)原型來(lái)看,可以看到兩者都具有兩個(gè)可選參數(shù),它們都必須指定為關(guān)鍵字參數(shù)。

key 指定帶有單個(gè)參數(shù)的函數(shù),用于從 iterable 的每個(gè)元素中提取用于比較的鍵 (例如 key=str.lower)。默認(rèn)值為 None (直接比較元素)。 key 形參的值應(yīng)該是個(gè)函數(shù)(或其他可調(diào)用對(duì)象),它接受一個(gè)參數(shù)并返回一個(gè)用于排序的鍵。

假設(shè)有其他類型的變量,比如一個(gè)自定義的類或者列表中又是一個(gè)列表。以官網(wǎng)例子為例有這樣一個(gè)列表,其元素為元組,

可以用以下方式按照年齡排序

類似的有自定義類

可以用如下方式進(jìn)行排序

也可以顯示定義一個(gè)函數(shù),且只有一個(gè)參數(shù),返回用于排序的鍵,比如

總之就是定義一個(gè)函數(shù)返回一個(gè)用于排序的鍵,可以用lambda函數(shù)或者 def 定義都可以。

上面實(shí)現(xiàn)的簡(jiǎn)單函數(shù)實(shí)際就是實(shí)現(xiàn)了返回一個(gè)有序結(jié)構(gòu)的第 n 的元素,或者某個(gè)類中的某個(gè)屬性,因此 Python 提供了便利功能,使訪問(wèn)器功能更容易,更快捷。operator 模塊有 itemgetter() 、 attrgetter() 函數(shù)。分別完成返回第 n 個(gè)元素,某個(gè)屬性功能。上面的排序可以用如下方式進(jìn)行實(shí)現(xiàn)

在python2中,sort有一個(gè) cmp 參數(shù),即用一個(gè)函數(shù)來(lái)自定義比較,在python3中這種方式被取消。為了繼承類似的用法,在 Python 3.2 中, functools.cmp_to_key() 函數(shù)被添加到標(biāo)準(zhǔn)庫(kù)中的 functools 模塊中。

這種作用先定義如何比較兩個(gè)變量,以上面的學(xué)生列表按照年齡排序?yàn)槔?/p>

這種做法自定義比較函數(shù)接收兩個(gè)形參,返回比較結(jié)果(bool),而新式方法接受一個(gè)參數(shù),返回的是比較的鍵。

假設(shè)有字典 d = {'b':2, 'a':1,'c':8,'d':4} ,則可以通過(guò)以下方式對(duì)字典按照鍵和值進(jìn)行排序

Python實(shí)現(xiàn)的快速排序算法詳解

Python實(shí)現(xiàn)的快速排序算法詳解

本文實(shí)例講述了Python實(shí)現(xiàn)的快速排序算法。分享給大家供大家參考,具體如下:

快速排序基本思想是:通過(guò)一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對(duì)這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,整個(gè)排序過(guò)程可以遞歸進(jìn)行,以此達(dá)到整個(gè)數(shù)據(jù)變成有序序列。

如序列[6,8,1,4,3,9],選擇6作為基準(zhǔn)數(shù)。從右向左掃描,尋找比基準(zhǔn)數(shù)小的數(shù)字為3,交換6和3的位置,[3,8,1,4,6,9],接著從左向右掃描,尋找比基準(zhǔn)數(shù)大的數(shù)字為8,交換6和8的位置,[3,6,1,4,8,9]。重復(fù)上述過(guò)程,直到基準(zhǔn)數(shù)左邊的數(shù)字都比其小,右邊的數(shù)字都比其大。然后分別對(duì)基準(zhǔn)數(shù)左邊和右邊的序列遞歸進(jìn)行上述方法。

實(shí)現(xiàn)代碼如下:

def parttion(v, left, right):

key = v[left]

low = left

high = right

while low high:

while (low high) and (v[high] = key):

high -= 1

v[low] = v[high]

while (low high) and (v[low] = key):

low += 1

v[high] = v[low]

v[low] = key

return low

def quicksort(v, left, right):

if left right:

p = parttion(v, left, right)

quicksort(v, left, p-1)

quicksort(v, p+1, right)

return v

s = [6, 8, 1, 4, 3, 9, 5, 4, 11, 2, 2, 15, 6]

print("before sort:",s)

s1 = quicksort(s, left = 0, right = len(s) - 1)

print("after sort:",s1)

運(yùn)行結(jié)果:

before sort: [6, 8, 1, 4, 3, 9, 5, 4, 11, 2, 2, 15, 6]

after sort: [1, 2, 2, 3, 4, 4, 5, 6, 6, 8, 9, 11, 15]

文章標(biāo)題:python快排庫(kù)函數(shù) python快速排序函數(shù)
分享路徑:http://www.chinadenli.net/article22/doojccc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站移動(dòng)網(wǎng)站建設(shè)企業(yè)建站面包屑導(dǎo)航搜索引擎優(yōu)化網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)