常見演算法之 選擇排序

2022-09-15 11:24:22 字數 1993 閱讀 3794

選擇排序

1.原理:是一種簡單直觀的排序演算法。原理是,將後面的元素最小元素乙個個取出來然後按順序放置。

2.步驟:

1.在未排序序列中找到最小元素,存放到排序序列的起始位置。

2.在從剩餘未排序元素中繼續尋找最小元素,然後放到已排序列的末尾。

3.重複第二步,直到所有元素都排列完畢。

3.**:

def selection_sort(li):

n=len(li)    #獲取li長度

for i in range (0,n):  #進行比較的輪數

min=i    #預設為最小值

for j in range(i+1,n):  #j為列表下標,如果找到比當前值小的值,則兩者交換

if li[j]堆排序:(一般用陣列儲存)

1.思想:堆是一種資料結構,可以將堆看作一顆完全二叉樹,這顆二叉樹滿足,任何乙個非葉節點的值都不大於(或不小於)其左右孩子節點的值。將乙個無序序列調整為乙個堆,

就可以找出這個序列的最大值(或最小值),然後將找出的這個值交換到序列的最後乙個,這樣有序序列就元素增加乙個,無序序列元素就減少乙個。對新的無序序列重複

這樣的操作,就實現了排序。

2.執行過程:

1.從無序序列所確定的完全二叉樹的第乙個非葉子節點開始,從右至左,從上至下,對每個節點進行調整,最終將得到乙個大頂堆。

上述過程,直到a的孩子節點的值都小於a為止。

2.將當前無序序列的第乙個元素(反應在數中的根節點b),與無序序列的最後乙個元素交換(假設為c),b進入有序序列,到達最終位置。無序序列元素減少乙個,有序序列元素

增加乙個,此時只有節點c可能不滿足堆的定義,對其進行調整。

3.重複2的過程,直到無序序列的元素剩下乙個時排序結束。

堆排序適應於記錄數很多的情況下

**: 

def sift_down(array,start,end):

while true: #當列表第乙個是以下標0開始,節點下標為i,左孩子下標則為2*i+1,右孩子下標

為2i+2,若下標以1開始,左孩子則為2*i,右孩子則為2*i+1

left_child=2*start+1 #左孩子節點下標

if left_child>end: #當節點的右孩子存在,且大於節點的左孩子

break

if left_child+1<=end and array[left_child+1]>array[left_child]:

left_child += 1

if array[left_child]>array[start]: #當左孩子的的最大值大於父節點時,則交換

array[left_child],array[start]=swap(array[left_child],array[start])

start=left_child #交換之後以交換子節點為根的堆可能不是大頂堆,需重新調整

else: #若父節點大於左右孩子,則跳出迴圈

break

def heap_sort(array): #堆排序

first=len(array)//2-1 #最後乙個有孩子的節點(//表示取整的意思)

#第乙個節點的下標為0,也可以為1,隨便定。

for i in range (first,-1,-1): #從最後乙個有孩子的節點往上調整

print(array[i])

sift_down(array,i,len[array]-1 #初始化大頂堆

print(「初始化大頂堆的結果:」,array)

for head_end in range (len[array]-1,0,-1):

array[head_end],array[0]=array[0],array[head_end] #交換堆頂與堆尾

sift_down(array,0,head_end-1)

常見排序演算法之直接選擇排序

直接選擇排序 straight select sorting 也是一種簡單的排序方法,它的基本思想是 第一次從r 0 r n 1 中選取最小值,與r 0 交換,第二次從r 1 r n 1 中選取最小值,與r 1 交換,第i次從r i 1 r n 1 中選取最小值,與r i 1 交換,第n 1次從r ...

常見排序演算法 選擇排序演算法

原理 1.選擇排序需要定義三個變數,i表示外層迴圈即for i 0 i 2.當i 0時,min初始值為i,此時min 0。內層迴圈j i 1開始到length 1處結束。當j 1時,比較a j 與a min 如果a j a min 則記錄最小值索引即min j。即if a j a min 當j 1時...

常見排序演算法01之氣泡排序與選擇排序

1 冒泡法 以8,16,1,5為例。假設從小到大,冒泡法是相鄰兩數比較的,那麼我們8和16比,8小所以不換,然後16與1比,16大要換,即變成了8,1,16,5 然後16和5比,16大要換,變成8,1,5,16。可以看出這是我們第一次相鄰兩兩比較的結果,並不能完全排好序,所以我們需要進行多次比較,多...