python中8大排序(原理+代码)
常用的排序方法:冒泡排序、選擇排序、插入排序、快速排序、堆排序、歸并排序
冒泡排序(Bubble Sort):
比較相鄰的元素。如果第一個(gè)比第二個(gè)大(升序),就交換他們兩個(gè)。
對(duì)每一對(duì)相鄰元素作同樣的工作,從開(kāi)始第一對(duì)到結(jié)尾的最后一對(duì)。這步做完后,最后的元素會(huì)是最大的數(shù)。
針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè)。
持續(xù)每次對(duì)越來(lái)越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對(duì)數(shù)字需要比較
選擇排序(Selection sort):
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
然后,再?gòu)氖S辔磁判蛟刂欣^續(xù)尋找最小(大)元素,
然后放到已排序序列的末尾。
以此類(lèi)推,直到所有元素均排序完畢。
插入排序:
開(kāi)始假定列表里下標(biāo)為0的元素是最小,在后面還未排序的數(shù)據(jù)里依次選取數(shù)據(jù)在前面有序區(qū)域里做比較并放在正確的位置,就像我們?cè)谕鎿淇伺频臅r(shí)候依次把撲克牌有順序的拜訪
import random def insert_sort(li):for i in range(1, len(li)):tmp = li[i] #tmp是無(wú)序區(qū)取出的一個(gè)數(shù)j = i - 1 #li[j]是有序區(qū)最大的那個(gè)數(shù)while j >= 0 and li[j] > tmp:# li[j]是有序區(qū)最大的數(shù),tmp是無(wú)序區(qū)取出的一個(gè)數(shù),tmp從有序區(qū)最大的那個(gè)數(shù)開(kāi)始比# 小就調(diào)換位置,直到找到有序區(qū)中值不大于tmp的結(jié)束li[j+1]=li[j] #將有序區(qū)最右邊的數(shù)向右移一個(gè)位置j = j - 1li[j + 1] = tmp #將tmp放到以前有序區(qū)最大數(shù)的位置,再依次與前一個(gè)數(shù)比較 data = list(range(100)) random.shuffle(data) #將有序列表打亂 insert_sort(data) print(data) 時(shí)間復(fù)雜度:o(n2) 空間復(fù)雜度:o(1) 穩(wěn)定性:穩(wěn)定快速排序:
隨機(jī)選取一個(gè)值,挨個(gè)跟后面的數(shù)值作比較,比該數(shù)值小的將放在左列表中,反之則放在右列表,返回形式為:左列表+[隨機(jī)值]+右列表,左右列表使用遞歸的方式繼續(xù)進(jìn)行排序。
''' 遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書(shū)! ''' def quick(list):if len(list) < 2:return listtmp = list[0] # 臨時(shí)變量 可以取隨機(jī)值left = [x for x in list[1:] if x <= tmp] # 左列表right = [x for x in list[1:] if x > tmp] # 右列表return quick(left) + [tmp] + quick(right)li = [4,3,7,5,8,2] print(quick(li))時(shí)間復(fù)雜度:O(nlog?n) 空間復(fù)雜度:O(nlog?n) 穩(wěn)定性:不穩(wěn)定堆排:
堆總是一棵完全二叉樹(shù),構(gòu)造堆、調(diào)整堆
構(gòu)造堆:每個(gè)根節(jié)點(diǎn)總是大于等于其子節(jié)點(diǎn),從最小堆依次往上做調(diào)整
調(diào)整堆:將堆頂最大元素出堆,將最后一個(gè)元素放至堆頂,然后用構(gòu)造堆的方法進(jìn)行調(diào)整,此過(guò)程循環(huán)往復(fù),將數(shù)據(jù)從大到小的順序依次出堆,直至此堆變空。
時(shí)間復(fù)雜度:O(nlogn)
空間復(fù)雜度:O(1)
穩(wěn)定性:不穩(wěn)定
歸并排序:
將列表越分越小,直至分成一個(gè)元素,一個(gè)元素是有效的,然后將兩個(gè)有序的列表合并。
時(shí)間復(fù)雜度:O(nlog?n)
空間復(fù)雜度:O(1)
穩(wěn)定性:穩(wěn)定
總結(jié)
以上是生活随笔為你收集整理的python中8大排序(原理+代码)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python列表中enumerate和z
- 下一篇: python3反转列表的三种方式