Python中八種基本排序方法

2021-09-19 13:15:56 字數 4999 閱讀 2303

1. 選擇排序方法

def select_sort(l):

for i in range(0,len(l)):

minl = l[i]

for j in range(i+1,len(l)):

if l[j] < minl:

temp = l[j]

l[j] = minl

minl = temp

l[i] = minl

選擇排序不過多解釋,只是通過遍歷把每次最小的放到當前的陣列頭

2. 插入排序方法

def insert_sort(l):

for x in range(1,len(l)):

for i in range(x-1,-1,-1):

if l[i] > l[i+1]:

temp = l[i+1]

l[i+1] = l[i]

l[i] = temp

插入排序也就是讓後面的依次插入到自己該去的位置,即可以模擬為撲克牌發牌,每次拿一張牌然後放在它該放的位置

3. 氣泡排序方法

def pop_sort(l):

length = len(l)

for i in range(1,length):

for j in range(0,length - i):

if l[j] > l[j+1]:

temp = l[j]

l[j] = l[j+1]

l[j+1] = temp

bubble,冒泡冒泡冒泡泡,原理就是冒泡泡

4. 快速排序方法

def quick_sort(l,start,end):

if start < end:

left = start

right = end

temp = l[start]

while left < right:

while left < right and l[right] >= temp:

right = right - 1

if(left < right):

l[left] = l[right]

left = left + 1

while left < right and l[left] <= temp:

left = left + 1

if(left < right):

l[left] = l[right]

right = right - 1

l[left] = temp

quick_sort(l,start,left-1)

quick_sort(l,left+1,end)

快排,好用,原理移動,但是不穩定,它會把部分排序好的排在後面,會對排序穩定性有很大影響,同時大量的資料可能會超過其所滿足的迭代深度,造成無法執行程式的後果

5. 希爾排序方法

def insert_shell(l):

gap = (int)(len(l)/2)

while(gap>=1):

for i in range (gap,len(l)):

for j in range(i-gap,-1,-gap):

if l[j] > l[j+gap]:

temp = l[j+gap]

l[j+gap] = l[j]

l[j] = temp

gap = (int)(gap/2)

希爾排序自己其實也只是一知半解,大概理解為乙個分組進行插入,用步長gap將待排序元素分成若干個子串行,然後對各組內進行插入排序,逐漸減小步長,gap=1時,該陣列便是有序的

6. 歸併排序方法

def mergearray(l,first,mid,last,temp):

i = first

j = mid + 1

k = 0

m = mid

n = last

while (i <= m) and (j <= n):

if l[i] <= l[j]:

temp[k] = l[i]

k = k + 1

i = i + 1

else:

temp[k] = l[j]

k = k + 1

j = j + 1

while i <= m:

temp[k] = l[i]

k = k + 1

i = i + 1

while j <= n:

temp[k] = l[j]

k = k + 1

j = j + 1

for i in range(0,k):

l[first + i] = temp[i]

def mergesort(l,first,last,temp):

if first < last:

mid = (int)((first + last)/2)

mergesort(l,first,mid,temp)

mergesort(l,mid+1,last,temp)

mergearray(a,first,mid,last,temp)

歸併不僅好用,穩定還方便理解,簡單理解為通過mergesort做到左有序,右有序,然後把左右再整合有序

7. 堆排序方法

def adjust(l,len,i):  #調整堆

left = (int)(2*i+1)

right = left + 1

max = i

#找大兒子

if (left < len) and l[left]>l[max]:

max = left

if (right < len) and l[right]>l[max]:

max = right

if max!=i:

temp = l[max]

l[max] = l[i]

l[i] = temp

adjust(l,len,max)

def heapsort(l,size):

for i in range(int(size/2)-1,-1,-1): #對每乙個非葉節點進行堆調整,從最後乙個非葉節點開始

adjust(l,size,i)

for i in range(size-1,0,-1):

temp = l[0]

l[0]=l[i]

l[i]=temp #將當前最大的放置到陣列的末尾

adjust(l,i,0) #將未完成排序的部分繼續進行堆排序

如上**所構建的為大頂堆,即根節點大於葉節點,簡單說就是父親大於兒子,然後通過交換父親與末尾節點,取出了本次迴圈的父親,然後在對剩下的進行調整,形成大頂堆,直到只有乙個元素的時候,迴圈結束,完成排序

8. 基數排序

#尋找最大數字的位數

def max_nums(l):

maxnum = l[0]

for i in l:

if maxnum < i:

maxnum = i

flag = 0 #統計位數

while (maxnum > 0):

maxnum = (int)(maxnum/10)

flag = flag + 1

return flag

#獲取num從低位到高位的第pos個位的資料

def get_num(num,pos):

return ((int)(num/(10**(pos-1))))%10

def radix_sort(l):

count = 10*[none] #存放每個桶的資料統計個數

bucket = (len(l))*[none] #暫時存放排序結果

for pos in range(1,max_nums(l)+1): #從個位開始迴圈

for i in range(0,10):

count[i] = 0

for i in range(0,len(l)): #統計當前位數的元素數目

j = get_num(int(l[i]),pos)

count[j] = count[j]+1

for i in range(1,10):

count[i] = count[i] + count[i-1]

for i in range(len(l)-1,-1,-1):

j = get_num(l[i],pos)

bucket[count[j] - 1] = l[i]

count[j] = count[j] - 1

for i in range(0,len(l)):

l[i] = bucket[i]

基數排序簡單理解可以理解成,我首先只看個位,對個位進行排序,然後再看十位,對十位進行排序,以此類推,直到看完最大數的位數即可,下面是乙個簡單的程式樣例型別。

l = [ 52 , 95 , 9 , 101 , 960 ]

我們可以獲得l的最高位數為3,然後對個位進行排序得到:

l = [ 960 , 101 , 52 , 95 , 9 ]
然後我們對十位進行排序可以得到:

l = [ 9 , 101 , 52 , 960 , 95 ]
然後我們對百位進行排序可以得到:

l = [ 9 , 52 , 95 , 101 , 960 ]
排序結束

上面的很多**都是自己在之前的c++模板上稍加修改的,本質還是要學各種排序方法的原理和相關知識

八種基本排序演算法

1 思路 對尚未排序的各元素從頭到尾依次比較相鄰的兩個元素是否逆序 與欲排順序相反 若逆序就交換這兩元素,經過第一輪比較排序後便可把最大 或最小 的元素排好 然後再用同樣的方法把剩下的元素逐個進行比較,就得到了你所要的順序 可以看出如果有 n 個元素,那麼一共要進行 n 1 輪比較,第 i 輪要進行...

八種排序方法總結

一 穩定性 穩定 氣泡排序 插入排序 歸併排序和基數排序 不穩定 選擇排序 快速排序 希爾排序 堆排序 二 平均時間複雜度 o n 2 直接插入排序,簡單選擇排序,氣泡排序。在資料規模較小時 9w內 直接插入排序,簡單選擇排序差不多。當資料較大時,氣泡排序演算法的時間代價最高。效能為o n 2 的演...

C 八種基本排序 選擇排序(2)

選擇排序 原理 從頭至尾掃瞄序列,找出最小的乙個元素,和第乙個元素交換,接著從剩下的元素中繼續這種選擇和交換方式,最終得到乙個有序序列。思路 在長度為n的無序陣列中,第一次遍歷n 1個數,找到最小的數值與第乙個元素交換 第二次遍歷n 2個數,找到最小的數值與第二個元素交換 第n 1次遍歷,找到最小的...