當前位置:成語大全網 - 書法字典 - 幾種經典排序方法在python中的實現

幾種經典排序方法在python中的實現

類別排序方法:

'''

插入排序的基本操作是將壹個數據插入到有序數據中,從而得到壹個編號加壹的新的有序數據。該算法適合對少量數據進行排序,時間復雜度為O (n 2)。是壹種穩定的排序方法。

插入算法將要排序的數組分成兩部分:

第壹部分包含這個數組的所有元素,除了最後壹個元素(讓數組多壹個空間來插入)

第二部分只包含這個元素(即要插入的元素)。

第壹部分排序後,將最後壹個元素插入排序後的第壹部分。

'''

def insert_sort(列表):

#插入排序

count = len(列表)

對於範圍內的I(1,計數):

key =列表[i]

j = i - 1

而j & gt= 0:

if列表[j]& gt;關鍵:

列表[j + 1] =列表[j]

列表[j] =鍵

j -= 1

返回列表

'''

外殼排序是插入排序的壹種。也稱為縮減增量排序,它是直接插入排序算法的更高效和改進版本。希爾排序是壹種不穩定的排序算法。這種方法是由dl提出後命名的。殼牌在1959。

Hill排序是將記錄按照目標的壹定增量進行分組,使用直接插入排序算法對每組進行排序;隨著增量逐漸減小,每個組包含的關鍵詞越來越多。當增量減少到1時,整個文件正好分成壹組,算法終止。

'''

def shell_sort(列表):

#希爾排序

count = len(列表)

步驟= 2

組=計數/步

while group & gt0:

對於範圍內的I(0,組):

j = i +組

而j & lt計數:

k = j -群

key =列表[j]

而k & gt= 0:

if列表[k]& gt;關鍵:

列表[k +組] =列表[k]

列表[k] =鍵

k -=組

j +=組

group /= step

返回列表

'''

冒泡排序已經反復訪問了要排序的序列,壹次比較兩個元素,如果它們的順序錯了就交換。訪問系列的工作壹直重復,直到不需要交換為止,也就是說系列已經排序了。

'''

定義冒泡_排序(列表):

#冒泡排序

count = len(列表)

對於範圍內的I(0,計數):

對於範圍內的j(I+1,計數):

if列表[I]& gt;列表[j]:

temp = lists[j]

列表[j] =列表[i]

列表[i] =臨時

返回列表

'''

快速排序

通過壹次排序將待排序的數據分成兩個獨立的部分,其中壹部分的所有數據都小於另壹部分,然後按照這種方法對這兩部分數據進行快速排序,整個排序過程可以遞歸進行,從而實現整個數據成為壹個有序序列。

'''

def quick_sort(列表,左,右):

#快速排序

如果離開& gt=右:

返回列表

key =列表[左]

低=左

高=右

同時離開& lt右:

同時離開& lt權限和列表[權限]& gt;=鍵:

右-= 1

列表[左] =列表[右]

同時離開& lt右和列表[左]& lt;=鍵:

left += 1

列表[右] =列表[左]

列表[右] =鍵

quick_sort(列表,低位,左- 1)

quick_sort(列表,左+ 1,高)

返回列表

'''

直接選擇排序

傳遞1,從要排序的記錄中選擇最小的記錄,與r[1]交換;

第二遍,從待排序的記錄r[2] ~ r[n]中選擇最小的記錄,與r[2]交換;

以此類推,在第I遍待排序的記錄r[i] ~ r[n]中選擇最小的記錄,與r[i]交換,使有序序列不斷增長,直到所有記錄排序完畢。

'''

定義select_sort(列表):

#選擇排序

count = len(列表)

對於範圍內的I(0,計數):

最小值= i

對於範圍內的j(I+1,計數):

if列表[min]& gt;列表[j]:

最小值= j

temp =列表[分鐘]

列表[min] =列表[i]

列表[i] =臨時

返回列表

'''

Heapsort是指利用堆樹(heap)的數據結構設計的壹種排序算法,是壹種選擇性排序。

您可以使用數組的特征來快速定位指定索引的元素。堆分為大根堆和小根堆,是壹棵完整的二叉樹。大根堆的要求是每個節點的值不大於其父節點的值,即a[parent[I]]>;= A[i].

在非降序排列的數組中,需要根堆,因為根據根堆的要求,最大值必須在堆的頂部。

'''

#調整堆

def adjust_heap(列表,I,大小):

lchild = 2 * i + 1

rchild = 2 * i + 2

最大值= i

如果我& lt尺寸/ 2:

如果lchild & lt大小和列表[lchild]>列表[最大]:

max = lchild

如果rchild & lt大小和列表[rchild]& gt;列表[最大]:

max = rchild

如果max!=我:

列表[最大值],列表[i] =列表[i],列表[最大值]

adjust_heap(列表,最大值,大小)

#創建堆

def build_heap(列表,大小):

對於範圍內的I(0,(大小/2))[::-1]:

adjust_heap(列表,I,大小)

#堆排序

定義堆排序(列表):

size = len(列表)

build_heap(列表,大小)

對於範圍(0,大小)[::-1]中的I:

列表[0],列表[i] =列表[i],列表[0]

adjust_heap(lists,0,I)

'''

歸並排序是壹種基於歸並操作的有效排序算法,是分而治之的壹個非常典型的應用。合並有序子序列以獲得完全有序的序列;也就是說,首先對每個子序列進行排序,然後對子序列段進行排序。如果兩個有序表合並成壹個有序表,稱為雙向合並。

合並過程如下:

比較a[i]和a[j]的大小。若a[i]小於等於a [j],則將第壹個有序表中的元素A [I]復制到r[k]中,I和K分別加1;

否則,將第二個有序表中的元素a[j]復制到r[k]中,並將J和K分別加1,以此類推,直到其中壹個有序表用完,再將另壹個有序表中剩余的元素復制到r中下標K到下標t的單元中,合並排序的算法通常是遞歸實現的。首先將待排序區間[s,t]用中點壹分為二,然後對左子區間排序,再對右子區間排序,最後通過壹次合並操作將左右區間合並為壹個有序區間[s,t]。

'''

定義合並(左、右):

I,j = 0,0

結果= []

而我& ltlen(左)和j & lt倫(右):

如果離開[I]& lt;= right[j]:

result.append(left[i])

i += 1

否則:

result.append(右[j])

j += 1

result += left[i:]

result += right[j:]

回送結果

定義合並排序(列表):

#合並排序

if len(列表)& lt= 1:

返回列表

num = len(列表)/ 2

left = merge_sort(列表[:數量])

right = merge_sort(lists[num:])

返回合並(左,右)

'''

基數排序屬於“分布排序”,也稱為“桶排序”或bin排序。顧名思義,它通過鍵值的壹些信息,將待排序的元素分布到壹些“桶”中,從而實現排序功能。基數排序屬於穩定排序。

它的時間復雜度為O (nlog(r)m),其中r是采用的基數,m是堆號。在某些情況下,基數排序法的效率高於其他穩定排序法。

'''

導入數學

def radix_sort(列表,radix=10):

k = int(math . ceil(math . log(max(lists),radix)))

bucket = [[] for i in range(radix)]

對於範圍內的I(1,k+1):

對於列表中的j:

bucket[j/(radix * *(I-1))%(radix * * I)]。追加(j)

刪除列表[:]

對於鏟鬥中的z:

列表+= z

del z[:]

返回列表

-

由CRazyDOgen

資料來源:CSDN

原文:/jipang 6225/文章/詳情/79975312

版權聲明:本文為博主原創文章,轉載請附上博客鏈接!