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次遍歷,找到最小的...