深入分析python 排序
排序是每個(gè)開發(fā)人員都需要掌握的技能。排序是對(duì)程序本身有一個(gè)全面的理解。不同的排序算法很好地展示了算法設(shè)計(jì)上如何強(qiáng)烈的影響程序的復(fù)雜度、運(yùn)行速度和效率。今天的文章和談?wù)劥蠹叶际煜さ母鞣N排序使用 Python 如何實(shí)現(xiàn),廢話就不多說啦,開干!
選擇排序
選擇排序一般是將初始值設(shè)為初始值,再循環(huán)后面每個(gè)元素與第一個(gè)元素比較,最終篩選出一個(gè)最小或最大值,最后將有序的數(shù)值排在前面,每次選擇當(dāng)前序列的最小值,將其與當(dāng)前序列的第一個(gè)元素交換位置,每迭代一次,當(dāng)前序列長度減一。迭代結(jié)束,即可得到有序序列。 實(shí)現(xiàn)代碼如下:
def select_s(data): # 第一層循環(huán):取出數(shù)組中的每個(gè)元素 for i in range(len(data)): temp = i # 拿取一個(gè)元素用來比較 # 第二層循環(huán):從第i后面的一個(gè)值開始循環(huán),與data[i]進(jìn)行比較 for j in range(i+1,len(data)): if data[j] < data[temp]: data[temp], data[j] = data[j], data[temp] print(data)
調(diào)用運(yùn)行結(jié)果:
if __name__ == '__main__': data = [14, 31, 14, 6, 18, 24, 2, 40] select_s(data)
輸出結(jié)果:
[2, 6, 14, 14, 18, 24, 31, 40]
插入排序
插入排序的基本操作就是將一個(gè)數(shù)據(jù)插入到已經(jīng)排好序的有序數(shù)據(jù)中,從而得到一個(gè)新的、個(gè)數(shù)加一的有序數(shù)據(jù),算法適用于少量數(shù)據(jù)的排序,時(shí)間復(fù)雜度為O(n^2)。是穩(wěn)定的排序方法。
插入算法把要排序的數(shù)組分成兩部分:第一部分包含了這個(gè)數(shù)組的所有元素,但將最后一個(gè)元素除外(讓數(shù)組多一個(gè)空間才有插入的位置),而第二部分就只包含這一個(gè)元素(即待插入元素)。在第一部分排序完成后,再將這個(gè)最后元素插入到已排好序的第一部分中。
實(shí)現(xiàn)代碼如下:
def insert_s(data): # 第一層循環(huán): 從第二個(gè)元素開始循環(huán)取出元素,取出的元素再與有序區(qū)元素進(jìn)行比較 for i in range(1,len(data)): temp = data[i] j = i-1 while j>=0 and temp < data[j]: data[j+1] = data[j] j = j-1 # 在與前面一個(gè)元素進(jìn)行比較,所以j 需要減1 # 當(dāng)j = -1 就跳出循環(huán),將temp值賦給第一個(gè)值,即data[0] data[j+1] = temp print(data)
調(diào)用運(yùn)行結(jié)果:
if __name__ == '__main__': data = [12, 3, 13, 56, 10, 22, 2, 40] insert_s(data)
輸出結(jié)果:
[2, 3, 10, 12, 13, 22, 40, 56]
冒泡排序
冒泡排序(順序形式),從左向右,兩兩比較,如果左邊元素大于右邊,就交換兩個(gè)元素的位置。
其中,每一輪排序,序列中最大的元素浮動(dòng)到最右面。也就是說,每一輪排序,至少確保有一個(gè)元素在正確的位置。
這樣接下來的循環(huán),就不需要考慮已經(jīng)排好序的元素了,每次內(nèi)層循環(huán)次數(shù)都會(huì)減一。
其中,如果有一輪循環(huán)之后,次序并沒有交換,這時(shí)我們就可以停止循環(huán),得到我們想要的有序序列了。
def insert_s(data): # 第一層循環(huán): 從第二個(gè)元素開始循環(huán)取出元素,取出的元素再與有序區(qū)元素進(jìn)行比較 for i in range(1,len(data)): temp = data[i] j = i-1 while j>=0 and temp < data[j]: data[j+1] = data[j] j = j-1 # 在與前面一個(gè)元素進(jìn)行比較,所以j 需要減1 # 當(dāng)j = -1 就跳出循環(huán),將temp值賦給第一個(gè)值,即data[0] data[j+1] = temp print(data)
調(diào)用運(yùn)行結(jié)果:
if __name__ == '__main__': data = [12, 3, 13, 56, 10, 22, 2, 40] insert_s(data)
輸出結(jié)果:
[2, 3, 10, 12, 13, 22, 40, 56]
快速排序
首先要打亂序列順序,以防算法陷入最壞時(shí)間復(fù)雜度。所以快速排序使用 “分而治之” 的方法。
對(duì)于一串序列,首先從中選取一個(gè)數(shù),凡是小于這個(gè)數(shù)的值就被放在左邊,凡是大于這個(gè)數(shù)的值就被放在右邊。然后,繼續(xù)對(duì)左右兩摞進(jìn)行快速排序。
直到進(jìn)行快速排序的序列長度小于 2 (即序列中只有一個(gè)值或者空值)。
代碼如下:
# 快速排序 def partition(data, left, right): temp = data[left] while left < right: # 如果最右邊的值大于中間值,則最右邊值往后退一個(gè)位置,反之,就將值賦值給最左邊位置 while left < right and data[right] >= temp: right = right - 1 data[left] = data[right] # 如果最左邊的值小于中間值,則最左邊值往前進(jìn)一個(gè)位置,反之,就將值賦值給最右邊位置 while left < right and data[left] <= temp: left = left + 1 data[right] = data[left] # 循環(huán)結(jié)束,即可定位到中間位置,將初始值,賦值到這個(gè)位置 data[left] = temp return left def quick_sort(data, left, right): if left < right: mid = partition(data, left, right) quick_sort(data, left, mid) quick_sort(data, mid + 1, right)
總結(jié)
今天的文章主要是使用 Python 實(shí)現(xiàn)各大排序程序,以及排序算法實(shí)現(xiàn)思路的梳理,自己學(xué)習(xí)的同時(shí)給大家整理思路!
示例代碼Python 排序了解一下?
以上就是深入分析python 排序的詳細(xì)內(nèi)容,更多關(guān)于python 排序的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- python 常見的排序算法實(shí)現(xiàn)匯總
- 用python給csv里的數(shù)據(jù)排序的具體代碼
- Python sorted對(duì)list和dict排序
- Python OrderedDict字典排序方法詳解
- python 實(shí)現(xiàn)多維數(shù)組(array)排序
- python對(duì)數(shù)組進(jìn)行排序,并輸出排序后對(duì)應(yīng)的索引值方式
- python通過對(duì)字典的排序,對(duì)json字段進(jìn)行排序的實(shí)例
- Python要如何實(shí)現(xiàn)列表排序的幾種方法
- Python中sorted()排序與字母大小寫的問題
相關(guān)文章
Python實(shí)現(xiàn)獲取彈幕的兩種方式分享
彈幕可以給觀眾一種“實(shí)時(shí)互動(dòng)”的錯(cuò)覺,在相同時(shí)刻發(fā)送的彈幕基本上也具有相同的主題,在參與評(píng)論時(shí)就會(huì)有與其他觀眾同時(shí)評(píng)論的錯(cuò)覺。本文為大家總結(jié)了兩個(gè)Python獲取彈幕的方法,希望對(duì)大家有所幫助2023-03-03python導(dǎo)入同級(jí)模塊的實(shí)現(xiàn)
這篇文章主要介紹了python導(dǎo)入同級(jí)模塊的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02Anaconda安裝之后Spyder打不開解決辦法(親測(cè)有效!)
這篇文章主要給大家介紹了關(guān)于Anaconda安裝之后Spyder打不開解決辦法,文中將解決的過程介紹的非常詳細(xì),親測(cè)有效,對(duì)同樣遇到這個(gè)問題的朋友具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-04-04教你用python實(shí)現(xiàn)12306余票查詢
今天就和大家一起來討論一下python實(shí)現(xiàn)12306余票查詢(pycharm+python3.7),一起來感受一下python爬蟲的簡單實(shí)踐,需要的朋友可以參考下2021-06-06Python編程實(shí)現(xiàn)使用線性回歸預(yù)測(cè)數(shù)據(jù)
這篇文章主要介紹了Python編程實(shí)現(xiàn)使用線性回歸預(yù)測(cè)數(shù)據(jù),具有一定借鑒價(jià)值,需要的朋友可以了解下。2017-12-12python實(shí)現(xiàn)動(dòng)態(tài)GIF英數(shù)驗(yàn)證碼識(shí)別示例
這篇文章主要為大家介紹了python實(shí)現(xiàn)動(dòng)態(tài)GIF英數(shù)驗(yàn)證碼識(shí)別示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01