基本的排序演算法

2021-08-21 08:30:49 字數 2419 閱讀 1892

容易的演算法效率比較低,但是容易理解。每乙個python的排序函式都會使用乙個swap的函式來交換列表中的兩項的位置,函式的**如下

def swap(lyst,i,j):

"""交換lyst中的i和j位置的item"""

temp=lyst[i]

lyst[i]=lyst[j]

lyst[j]=temp

pass

或者python中極具特色的:

"""使用python的特色方法交換list中的i和j的item"""

lyst[i],lyst[j]=lyst[j],lyst[i]

最簡單的策略就是每一次找到最小的和它本應該的位置進行交換,在每一輪的時候只是交換兩個位置;

流程應該是用乙個迴圈來控制需要排序的位置的確定,然後用內嵌的迴圈是來找到後續的最小的數來,最後跳出來迴圈,進行交換

def selectionsort(lyst):

"""選擇排序"""

i=0while i該函式包含了乙個巢狀的迴圈,對於大小為n的列表,外圍的迴圈執行n-1次,在外部的第一次迴圈時,內部的迴圈的次數為n-1次,當外部的迴圈是第二次的時候,內部的迴圈的次數是n-2次,最後的一次外部的迴圈時,內部的迴圈的次數為1 次。因此該演算法的複雜度是(n-1)+(n-2)……+1+0+n=1/2n^2+1/2n、

對於較大的n,可以忽略常數的係數,因此複雜度為o(n^2)。對於較大的資料集合,交換資料的開銷可能會很大,因為交換兩個資料的操作是在外圍的迴圈裡面的,所以在最壞的情況下和平均的情況下,選擇排序的額外的開銷是線性的。

氣泡排序比較容易理解和編碼。策略是從列表的開頭處開始,並且比較一對的資料項,直到移動到資料列表的末尾。每當演算法的位置不對時,演算法就開始交換其位置。整個過程就是以冒泡的方式將最大的項拍到列表的末尾,然後演算法從列表的開頭到倒數的第二項重複這一過程。

冒牌排序的主演算法主要是通過兩個迴圈來進行的。第乙個迴圈來確定的需要進行冒泡的項。第二個迴圈來進行冒泡的操作。**如下:

def bublesort(lyst):

"""氣泡排序法"""

i=0while ilyst[j+1]:

swap(lyst,j,j+1)

j+=1

if (j==len(lyst)-1):

print(j)

break

i+=1

print(i,lyst)#輸出迴圈的次數和每一次迴圈的結果

pass

return lyst

演算法的複雜度分析,對於冒泡演算法其複雜度也是o(n^2)。和選擇排序一樣。

可以對冒泡演算法的程式做以下的修正,以使得演算法的複雜度(最好的情況下)的效能提公升到線性階。如果在通過主迴圈的時候,list就是排序好的。這種情況可能發生在任何乙個迴圈的輪次,但是在最好的情況下,第一輪就會發生,可以使用乙個boolean的標誌來標記交換動作的出現。並且當內部的迴圈沒有這個標誌的時候,就從函式返回。

**如下

def bublesorttweak(lyst):

"""氣泡排序法的改進版"""

i=0while ilyst[j+1]:

swap(lyst,j,j+1)

j+=1

flag=true

if (j==len(lyst)-1):

break

pass

if not flag:

return lyst

pass

i+=1

return lyst

這樣的改進只是為了最好的情況,但是在平均的情況下,其複雜度仍然為o(n^2)

插入排序是試圖以一種不同的方式來對列表進行修改

方法如下:

在第i輪的時候,第i個項應該插入到list的前i個項的正確的位置

在第i輪之後,第i個項應該是排好序的

這個過程類似手中的撲克牌的排列過程,也就是按照順序放好了前面的i-1張牌,抓取了第i張,並且將其與手中的這些牌進行比較,直到將其放到合適的位置。

和其他的演算法一樣,插入排序同樣具有兩個迴圈,外圍的迴圈是遍歷從1到n-1的位置,對於這個迴圈中的每乙個位置i都儲存該項並且從位置n-1開始內部的迴圈,對於這個迴圈中的每乙個位置j,都將移動到位置j+1,直到找到給儲存的項(第i項)的插入位置

對於插入排序的理解就是用乙個迴圈來控制項的選取,用內迴圈來控制所有滿足條件的項的後移,然後給他後移空下來的位置上進行新增項

**如下:

def insertsort(lyst):

"""這是插入排序的函式"""

i=1while i=0:

if itemtoinsert

分析巢狀的迴圈,外圍的迴圈執行了n-1次,在最壞的時候,當所有的資料都是未排序的時候,插入排序的最壞的情況的複雜度是o(n^2)

列表中排好序的項越多,插入排序的效果越好。在最好的情況下,插入排序的複雜度就是線性階的

基本的排序演算法

演算法思路 假設a 1 n 是乙個有n個元素的陣列。首先從a 1 n 找到最小元素,將其放在a 1 中 從a 2 n 中找到最小元素,將其放在a 2 中 重複a i n 中找到最小元素,將其放在a i 中 直至i n 1 元素比較次數 n i 1 n i ni 1i n n 1 2 時間複雜度為o ...

基本的排序演算法

時間複雜度o n2 空間複雜度o 1 穩定 public void bubblesort int a 時間複雜度 o n2 空間複雜度o 1 不穩定 public void selectsort int a int temp a i a i a min a min temp 時間複雜度 o n2 空...

基本的排序演算法

原理 比較兩個相鄰的元素,將值大的元素交換到右邊 思路 依次比較相鄰的兩個數,將比較小的數放在前面,比較大的數放在後面。function bubblesort arr bubblesort arr1 首先在未排序序列中找到最小 大 元素,存放到排序序列的起始位置。再從剩餘未排序元素中繼續尋找最小 大...