常見的排序演算法及python實現

2022-08-19 08:21:13 字數 3090 閱讀 8965

排序大的分類可以分為兩種:內排序和外排序。在排序過程中,全部記錄存放在記憶體,則稱為內排序,如果排序過程中需要使用外存,則稱為外排序。

內排序有可以分為以下幾類:

(1)、插入排序:直接插入排序、二分法插入排序、希爾排序。

(2)、選擇排序:簡單選擇排序、堆排序。

(3)、交換排序:氣泡排序、快速排序。

(4)、歸併排序

(5)、基數排序

在學習了python一段時間後,自己嘗試用python實現:插入排序、氣泡排序、快速排序、直接選擇排序、歸併排序。

一、插入排序

插入排序的基本操作就是將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的、個數加一的有序資料,演算法適用於少量資料的排序,時間複雜度為 o(n^2)。是穩定的排序方法。

插入演算法把要排序的陣列分成兩部分:第一部分包含了這個陣列的所有元素,但將最後乙個元素除外(讓陣列多乙個空間才有插 入的位置),而第二部分就只包含這乙個元素(即待插入元素)。在第一部分排序完成後,再將這個最後元素插入到已排好序的第一部分中

#插入排序

def insert_sort(sort_array):

n=len(sort_array)

for i in range(1,n):

temp=sort_array[i]  #儲存當前位置

#尋找要插入的順序

jj = 0

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

if(temp>=sort_array[j]):

jj=j+1

break

#將該位置後的元素後移

for m in range(i,jj,-1):

sort_array[m] = sort_array[m-1]

#插入當前值

sort_array[jj] = temp

return sort_array

二、氣泡排序

它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。

#氣泡排序

def maopao_sort(sort_array):

n=len(sort_array)

for i in range(n):

flag=true

for j in range(n-i-1):

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

flag=false

sort_array[j],sort_array[j+1]=sort_array[j+1],sort_array[j]

if flag==true:

break

return sort_array

三、快速排序

通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。

#快速排序

def kuaisu_sort(sort_array,left,right):

if left>=right:

return

key=sort_array[left]

low=left

high=right

while left=key:

right -= 1

sort_array[left]=sort_array[right]

while left四、直接選擇排序

基本思想:第1趟,在待排序記錄r1 ~ r[n]中選出最小的記錄,將它與r1交換;第2趟,在待排序記錄r2 ~ r[n]中選出最小的記錄,將它與r2交換;以此類推,第i趟在待排序記錄r[i] ~ r[n]中選出最小的記錄,將它與r[i]交換,使有序序列不斷增長直到全部排序完畢。

#選擇排序

def xuanze_sort(sort_array):

n=len(sort_array)  

for i in range(n-1):

min=sort_array[i]

minindex=i

for j in range(i+1,n):

if sort_array[j]五、歸併排序

歸併排序是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成一 個有序表,稱為二路歸併。

歸併過程為:比較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]。

驗證結果:

if __name__ == '__main__':

array1=[21,34,56,9,12,3]

array2=[21,34,56,9,12,3]

array3=[21,34,56,9,12,3]

array4=[21,34,56,9,12,3]

array5=[21,34,56,9,12,3]

array6=[3,4,5,9,22,1,222,444,666]

print "berore sort is:",array1

print "after sort is :",maopao_sort(array1)  

print "after sort is :",xuanze_sort(array2)

print "after sort is :",insert_sort(array3)

print "after sort is :",kuaisu_sort(array4,0,5)

print "after sort is :",merge_sort(maopao_sort(array5),maopao_sort(array6))

Python歸併排序及常見排序演算法的比較

一 歸併排序 歸併排序是採用分治法的乙個非常典型的應用。歸併排序的思想就是先遞迴分解陣列,再合併陣列。將陣列分解最小之後,然後合併兩個有序陣列,基本思路是比較兩個陣列的最前面的數,誰小就先取誰,取了後相應的指標就往後移一位。然後再比較,直至乙個陣列為空,最後把另乙個陣列的剩餘部分複製過來即可。二 p...

常見排序演算法及實現

關於冒泡最優情況說明一下,o n 是指在使用標誌情況下,否則仍是o n 氣泡排序 本人習慣先把最大的選出來,放到右邊 void maopao int arr,int n return 使用標誌的氣泡排序,最好可達到o n void bubble sort int d,int size 快速排序 vo...

gcForest演算法原理及Python實現

1.背景介紹 從目前來看深度學習大多建立在多層的神經網路基礎上,也即一些引數化的多層可微的非線性模組,這樣就可以通過後向傳播去訓練,zhi hua zhou和ji feng在deep forest 中基於不可微的模組建立深度模組,這就是gcforest。傳統的深度學習有一定的弊端 超引數個數較多,訓...