當前位置:首頁 » 編程語言 » python實現排序演算法

python實現排序演算法

發布時間: 2024-09-10 12:08:19

① 面試必會八大排序演算法python

一、插入排序

介紹

插入排序的基本操作就是將一個數據插入到已經排好序的有序數據中,從而得到一個新的、個數加一的有序數據。

演算法適用於少量數據的排序,時間復雜度為O(n^2)。

插入排演算法是穩定的排序方法。

步驟

①從第一個元素開始,該元素可以認為已經被排序

②取出下一個元素,在已經排序的元素序列中從後向前掃描

③如果該元素(已排序)大於新元素,將該元素移到下一位置

④重復步驟3,直到找到已排序的元素小於或者等於新元素的位置

⑤將新元素插入到該位置中

⑥重復步驟2

排序演示

演算法實現

二、冒泡排序

介紹

冒泡排序(Bubble Sort)是一種簡單的排序演算法,時間復雜度為O(n^2)。

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

這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。

原理

循環遍歷列表,每次循環找出循環最大的元素排在後面;

需要使用嵌套循環實現:外層循環控制總循環次數,內層循環負責每輪的循環比較。

步驟

①比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。

②對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。

③針對所有的元素重復以上的步驟,除了最後一個。

④持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。

演算法實現:

三、快速排序

介紹

快速排序(Quicksort)是對冒泡排序的一種改進,借用了分治的思想,由C. A. R. Hoare在1962年提出。

基本思想

快速排序的基本思想是:挖坑填數 + 分治法。

首先選出一個軸值(pivot,也有叫基準的),通過一趟排序將待排記錄分隔成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序。

實現步驟

①從數列中挑出一個元素,稱為 「基準」(pivot);

②重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊);

③對所有兩個小數列重復第二步,直至各區間只有一個數。

排序演示

演算法實現

四、希爾排序

介紹

希爾排序(Shell Sort)是插入排序的一種,也是縮小增量排序,是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法,時間復雜度為:O(1.3n)。

希爾排序是基於插入排序的以下兩點性質而提出改進方法的:

·插入排序在對幾乎已經排好序的數據操作時, 效率高, 即可以達到線性排序的效率;

·但插入排序一般來說是低效的, 因為插入排序每次只能將數據移動一位。

基本思想

①希爾排序是把記錄按下標的一定量分組,對每組使用直接插入演算法排序;

②隨著增量逐漸減少,每組包1含的關鍵詞越來越多,當增量減至1時,整個文件恰被分成一組,演算法被終止。

排序演示

演算法實現

五、選擇排序

介紹

選擇排序(Selection sort)是一種簡單直觀的排序演算法,時間復雜度為Ο(n2)。

基本思想

選擇排序的基本思想:比較 + 交換。

第一趟,在待排序記錄r1 ~ r[n]中選出最小的記錄,將它與r1交換;

第二趟,在待排序記錄r2 ~ r[n]中選出最小的記錄,將它與r2交換;

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

排序演示

選擇排序的示例動畫。紅色表示當前最小值,黃色表示已排序序列,藍色表示當前位置。

演算法實現

六、堆排序

介紹

堆排序(Heapsort)是指利用堆積樹(堆)這種數據結構所設計的一種排序演算法,它是選擇排序的一種。

利用數組的特點快速指定索引的元素。

基本思想

堆分為大根堆和小根堆,是完全二叉樹。

大根堆的要求是每個節點的值不大於其父節點的值,即A[PARENT[i]] >=A[i]。

在數組的非降序排序中,需要使用的就是大根堆,因為根據大根堆的要求可知,最大的值一定在堆頂。

排序演示

演算法實現

七、歸並排序

介紹

歸並排序(Merge sort)是建立在歸並操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。

基本思想

歸並排序演算法是將兩個(或兩個以上)有序表合並成一個新的有序表,即把待排序序列分為若干個子序列,每個子序列是有序的。然後再把有序子序列合並為整體有序序列。

演算法思想

自上而下遞歸法(假如序列共有n個元素)

① 將序列每相鄰兩個數字進行歸並操作,形成 floor(n/2)個序列,排序後每個序列包含兩個元素;

② 將上述序列再次歸並,形成 floor(n/4)個序列,每個序列包含四個元素;

③ 重復步驟②,直到所有元素排序完畢。

自下而上迭代法

① 申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合並後的序列;

② 設定兩個指針,最初位置分別為兩個已經排序序列的起始位置;

③ 比較兩個指針所指向的元素,選擇相對小的元素放入到合並空間,並移動指針到下一位置;

④ 重復步驟③直到某一指針達到序列尾;

⑤ 將另一序列剩下的所有元素直接復制到合並序列尾。

排序演示

演算法實現

八、基數排序

介紹

基數排序(Radix Sort)屬於「分配式排序」,又稱為「桶子法」。

基數排序法是屬於穩定性的排序,其時間復雜度為O (nlog(r)m) ,其中 r 為採取的基數,而m為堆數。

在某些時候,基數排序法的效率高於其他的穩定性排序法。

基本思想

將所有待比較數值(正整數)統一為同樣的數位長度,數位較短的數前面補零。然後,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成以後,數列就變成一個有序序列。

基數排序按照優先從高位或低位來排序有兩種實現方案:

MSD(Most significant digital) 從最左側高位開始進行排序。先按k1排序分組, 同一組中記錄, 關鍵碼k1相等,再對各組按k2排序分成子組, 之後, 對後面的關鍵碼繼續這樣的排序分組, 直到按最次位關鍵碼kd對各子組排序後. 再將各組連接起來,便得到一個有序序列。MSD方式適用於位數多的序列。

LSD (Least significant digital)從最右側低位開始進行排序。先從kd開始排序,再對kd-1進行排序,依次重復,直到對k1排序後便得到一個有序序列。LSD方式適用於位數少的序列。

排序效果

演算法實現

九、總結

各種排序的穩定性、時間復雜度、空間復雜度的總結:

平方階O(n²)排序:各類簡單排序:直接插入、直接選擇和冒泡排序;

從時間復雜度來說:

線性對數階O(nlog₂n)排序:快速排序、堆排序和歸並排序;

O(n1+§))排序,§是介於0和1之間的常數:希爾排序 ;

線性階O(n)排序:基數排序,此外還有桶、箱排序。

② python常見的三種列表排序演算法分別是什麼

排序是計算機程序設計中的一種重要操作,它的功能是將一個數據元素的任意序列,重新排列成一個關鍵字有序的序列。那麼python列表排序演算法有哪些?本文主要為大家講述python中禪棚經常用的三種排序演算法:冒泡排序、插入排序和選擇排序。

1、冒泡排序

冒泡排序,Bubble

Sort,是一種簡單的排序演算法。它重復地遍歷要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。遍歷數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢浮到數列的頂端。

2、插入排序

插戚襲差入排序,Insertion

Sort,是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。插入排序在實現上,在從後向前的掃描過程中,需要把已排序元素逐步向後挪位,為最新元素提供插入空間。

3、選擇高皮排序

選擇排序,Selection

Sort,是一種簡單直觀的排序演算法。它的工作原理如下:首先在未排序序列中找到最小、最大元素,存放到排序序列的起始位置,然後再從剩餘未排序元素中繼續尋找最小、最大元素。放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。

③ python將時間按多少先後排序正確的是

導讀:很多朋友問到關於python將時間按多少先後排序正確的是的相關問題,本文首席CTO筆記就來為大家做個詳細解答,供大家參考,希望對大家有所幫助!一起來看看吧!

python中按文件時間順序來排列一個文件夾下面的文件,如何實現?

建立一個字典,鍵是文件名,鍵值是時間屬性,

然後用內置的sorted()函數,根據字典的值進行排序,返回一個有序的列表

假設字典名字叫folder,有序列表叫order

order=sorted(folder.items(),key=lambdae:e[1],reverse=False)

key=lambdae:e[1]表示按值進行排序,也就是你需要的按時間屬性排序,e[0]則是按鍵名進行排序

reverse=False可以省略不寫,默認是升序排列,reverse=True就是降序排列了

按時間先後順序排列正確的是

下列中國古代朝代按時間先後排列正確的是,隋唐秦漢宋元明清

下列中國古代朝代順序排列正確的一項是(B)

A.隋唐-秦漢-宋元-明清?B.秦漢-隋唐-宋元-明清?C.宋元-隋唐-秦漢-明清?D.明清-宋元-秦漢-隋唐

是指最新的時間排在最前,以此往下進行排序。與之相反的按時間升序排序。在實際應用中,各種評論一般默認排序是按時間降序排序。在實際很多應用中,經常需要進行排序,一般都是對象中的一個屬性進行升序或降序,其中對時間進行排序是最常見一個屬性。

排序的演算法有很多,對空間的要求及其時間效率也不盡相同。下面列出了一些常見的排序演算法。

相關介紹:

排序依據—按以下三個選項之一進行排序:數據源順序—數據源對數據進行自然排序的順序。通常,對於關系數據源,這往往是按字母順序-更具體而言,是採用自然排序順序,其與字母順序相同,但多位數字會作為單個字元進行排序。

因此,例如,如果按字母順序排序,"z11"先於"z2",因為"1"的計算結果小於"2",但是如果按自然順序排序,"z2"先於"z11",因為"2"的計算結果小於"11"。

如果使用的是多維數據集,則該順序是維度內成員的定義分層順序。字母—字母表中的字母順序。欄位?—基於另一個欄位的關聯值對數據進行排序。例如,您可按多種產品的總銷售額對這些產品進行排序。按時間降序排序是指最新的時間排在最前,以此往下進行排序。

用python編寫程序。問題如下:有兩列數據,一列是時間,形式為2011/5/3119:00,另一列是一個具體的數值

數據先導入,通常用csv。

然後是時間格式轉換用time.strptime

轉換完的時間可以直接取到hour,miniute,等屬性,你直接按hour做當天平均值,再做月份的平均值。(其實可以一直計算,不用分開算)

最簡單的辦法是1個月的數據,全放在一起,按時間排序,然後按小時平均就可以了。

如果不想麻煩就這樣

sum([vfort,vindataift.hour==2])/len([vfort,vindataift.hour==2])

這句話就是計算2點的數據平均值

怎樣用python將文件里儲存的時間按時間范圍分類並且統計時間個數,然後存放在另一個文件里?

1,把時間的類型,最後變成timestamp類型,好操作

2,用pandas裡面有.loc()這個函數可以判斷范圍,可以參考我的博客--判斷時間是不是在一個區間范圍內:

網頁鏈接

python如何對日期進行從小到大排序

其實直接sorted排序就行.如果要嚴謹的花,改成用時間戳排序就是.

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

classSortMethod:

'''

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

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

第一部分包含了這個數組的所有元素,但將最後一個元素除外(讓數組多一個空間才有插入的位置)

第二部分就只包含這一個元素(即待插入元素)。

在第一部分排序完成後,再將這個最後元素插入到已排好序的第一部分中。

'''

definsert_sort(lists):

#插入排序

count=len(lists)

foriinrange(1,count):

key=lists[i]

j=i-1

whilej=0:

iflists[j]key:

lists[j+1]=lists[j]

lists[j]=key

j-=1

returnlists

'''

希爾排序(ShellSort)是插入排序的一種。也稱縮小增量排序,是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法。該方法因DL.Shell於1959年提出而得名。

希爾排序是把記錄按下標的一定增量分組,對每組使用直接插入排序演算法排序;隨著增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至1時,整個文件恰被分成一組,演算法便終止。

'''

defshell_sort(lists):

#希爾排序

count=len(lists)

step=2

group=count/step

whilegroup0:

foriinrange(0,group):

j=i+group

whilejcount:

k=j-group

key=lists[j]

whilek=0:

iflists[k]key:

lists[k+group]=lists[k]

lists[k]=key

k-=group

j+=group

group/=step

returnlists

'''

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

'''

defbubble_sort(lists):

#冒泡排序

count=len(lists)

foriinrange(0,count):

forjinrange(i+1,count):

iflists[i]lists[j]:

temp=lists[j]

lists[j]=lists[i]

lists[i]=temp

returnlists

'''

快速排序

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

'''

defquick_sort(lists,left,right):

#快速排序

ifleft=right:

returnlists

key=lists[left]

low=left

high=right

whileleftright:

whileleftrightandlists[right]=key:

right-=1

lists[left]=lists[right]

whileleftrightandlists[left]=key:

left+=1

lists[right]=lists[left]

lists[right]=key

quick_sort(lists,low,left-1)

quick_sort(lists,left+1,high)

returnlists

'''

直接選擇排序

第1趟,在待排序記錄r[1]~r[n]中選出最小的記錄,將它與r[1]交換;

第2趟,在待排序記錄r[2]~r[n]中選出最小的記錄,將它與r[2]交換;

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

'''

defselect_sort(lists):

#選擇排序

count=len(lists)

foriinrange(0,count):

min=i

forjinrange(i+1,count):

iflists[min]lists[j]:

min=j

temp=lists[min]

lists[min]=lists[i]

lists[i]=temp

returnlists

'''

堆排序(Heapsort)是指利用堆積樹(堆)這種數據結構所設計的一種排序演算法,它是選擇排序的一種。

可以利用數組的特點快速定位指定索引的元素。堆分為大根堆和小根堆,是完全二叉樹。大根堆的要求是每個節點的值都不大於其父節點的值,即A[PARENT[i]]=A[i]。

在數組的非降序排序中,需要使用的就是大根堆,因為根據大根堆的要求可知,最大的值一定在堆頂。

'''

#調整堆

defadjust_heap(lists,i,size):

lchild=2*i+1

rchild=2*i+2

max=i

ifisize/2:

iflchildsizeandlists[lchild]lists[max]:

max=lchild

ifrchildsizeandlists[rchild]lists[max]:

max=rchild

ifmax!=i:

lists[max],lists[i]=lists[i],lists[max]

adjust_heap(lists,max,size)

#創建堆

defbuild_heap(lists,size):

foriinrange(0,(size/2))[::-1]:

adjust_heap(lists,i,size)

#堆排序

defheap_sort(lists):

size=len(lists)

build_heap(lists,size)

foriinrange(0,size)[::-1]:

lists[0],lists[i]=lists[i],lists[0]

adjust_heap(lists,0,i)

'''

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

歸並過程為:

比較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]。

'''

defmerge(left,right):

i,j=0,0

result=[]

whileilen(left)andjlen(right):

ifleft[i]=right[j]:

result.append(left[i])

i+=1

else:

result.append(right[j])

j+=1

result+=left[i:]

result+=right[j:]

returnresult

defmerge_sort(lists):

#歸並排序

iflen(lists)=1:

returnlists

num=len(lists)/2

left=merge_sort(lists[:num])

right=merge_sort(lists[num:])

returnmerge(left,right)

'''

基數排序(radixsort)屬於「分配式排序」(distributionsort),又稱「桶子法」(bucketsort)或binsort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些「桶」中,藉以達到排序的作用,基數排序法是屬於穩定性的排序。

其時間復雜度為O(nlog(r)m),其中r為所採取的基數,而m為堆數,在某些時候,基數排序法的效率高於其它的穩定性排序法。

'''

importmath

defradix_sort(lists,radix=10):

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

bucket=[[]foriinrange(radix)]

foriinrange(1,k+1):

forjinlists:

bucket[j/(radix**(i-1))%(radix**i)].append(j)

dellists[:]

forzinbucket:

lists+=z

delz[:]

returnlists

---------------------

作者:CRazyDOgen

來源:CSDN

原文:

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

結語:以上就是首席CTO筆記為大家整理的關於python將時間按多少先後排序正確的是的相關內容解答匯總了,希望對您有所幫助!如果解決了您的問題歡迎分享給更多關注此問題的朋友喔~

熱點內容
微服務無狀態存儲管理 發布:2024-11-25 03:34:43 瀏覽:22
行上傳 發布:2024-11-25 03:33:07 瀏覽:484
催款訪問 發布:2024-11-25 03:33:06 瀏覽:999
dhcp伺服器無法連接ip地址 發布:2024-11-25 03:23:09 瀏覽:949
ts伺服器地址 發布:2024-11-25 03:19:26 瀏覽:295
蘋果設置新的id賬號和密碼忘了怎麼辦啊 發布:2024-11-25 03:12:28 瀏覽:11
安卓電腦鍵盤圖標怎麼刪除 發布:2024-11-25 03:07:52 瀏覽:143
洞庭游戲源碼 發布:2024-11-25 03:07:05 瀏覽:74
相關檢測演算法 發布:2024-11-25 03:02:44 瀏覽:919
壓縮機抽氣器 發布:2024-11-25 03:02:43 瀏覽:325