python冒泡演算法
排序是計算機程序設計中的一種重要操作,它的功能是將一個數據元素的任意序列,重新排列成一個關鍵字有序的序列。那麼python列表排序演算法有哪些?本文主要為大家講述python中禪棚經常用的三種排序演算法:冒泡排序、插入排序和選擇排序。
1、冒泡排序
冒泡排序,Bubble
Sort,是一種簡單的排序演算法。它重復地遍歷要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。遍歷數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢浮到數列的頂端。
2、插入排序
插戚襲差入排序,Insertion
Sort,是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。插入排序在實現上,在從後向前的掃描過程中,需要把已排序元素逐步向後挪位,為最新元素提供插入空間。
3、選擇高皮排序
選擇排序,Selection
Sort,是一種簡單直觀的排序演算法。它的工作原理如下:首先在未排序序列中找到最小、最大元素,存放到排序序列的起始位置,然後再從剩餘未排序元素中繼續尋找最小、最大元素。放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。
❷ python使用冒泡排序
冒泡排序(Bubble Sort)也是一種簡單直觀的排序演算法。它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢"浮"到數列的頂端。
def bubbleSort(arr):
n = len(arr)
# 遍歷所有數組元素
for i in range(n):
# Last i elements are already in place
for j in range(0, n-i-1):
if arr[j] > arr[j+1] :
arr[j], arr[j+1] = arr[j+1], arr[j]
arr = [64, 34, 25, 12, 22, 11, 90]
bubbleSort(arr)
print ("排序後的數組:")
for i in range(len(arr)):
print ("%d" %arr[i])
❸ 面試必會八大排序演算法(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冒泡排序運行順序
不是的,1是將第一個數逐個於它後面的數進行比較,比如i=1,就是18。這個就是所謂的冒泡演算法。
❺ Python冒泡排序注意要點實例詳解
Python冒泡排序注意要點實例詳解
文給大家介紹了python冒泡排序知識,涉及到冒泡排序主要的細節問題,本文通過實例代碼給大家講解,介紹的非常詳細,具有參考借鑒價值,感興趣的朋友一起看看吧
冒泡排序注意三點:
1. 第一層循環可不用循環所有元素。
2.兩層循環變數與第一層的循環變數相關聯。
3.第二層循環,最終必須循環集合內所有元素。
示例代碼一:
1.第一層循環,只循環n-1個元素。
2.當第一層循環變數為n-1時,第二層循環所有元素。
s = [3, 4, 1, 6, 2, 9, 7, 0, 8, 5]
# bubble_sort
for i in range(0, len(s) - 1):
for j in range(i + 1, 0, -1):
if s[j] < s[j - 1]:
s[j], s[j - 1] = s[j - 1], s[j]
for m in range(0, len(s)):
print(s[m])
示例代碼二:
1.第一層循環所有元素。
2.第二層也循環所有元素。
s = [3, 4, 1, 6, 2, 9, 7, 0, 8, 5]
for i in range(0, len(s)):
for j in range(i, 0, -1):
if s[j] < s[j - 1]:
s[j], s[j - 1] = s[j - 1], s[j]
for m in range(0, len(s)):
print(s[m])
以上所述是小編給大家介紹的python冒泡排序演算法注意要點,希望對大家有所幫助
❻ python寫冒泡排序
冒泡排序(Bubble Sort),是一種計算機科學領域的較簡單的排序演算法。
它重復地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果順序(如從大到小、首字母從Z到A)錯誤就把他們交換過來。走訪元素的工作是重復地進行直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。
這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端(升序或降序排列),就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端一樣,故名「冒泡排序」。
中文名
冒泡排序
外文名
Bubble Sort
所屬學科
計算機科學
時間復雜度
O(n2)
演算法穩定性
穩定排序演算法
快速
導航
演算法分析演算法描述優化演算法比較
演算法原理
冒泡排序演算法的原理如下:[1]
比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。[1]
對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。[1]
針對所有的元素重復以上的步驟,除了最後一個。[1]
持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。
❼ python冒泡排序法求告知哪裡錯了_(:з」∠)_
冒泡排序演算法的運作如下:
1. 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
2. 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。
3. 針對所有的元素重復以上的步驟,除了最後一個。
4. 持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。
所以可以看出,你代碼僅僅比較了一次相鄰的兩個,而沒有繼續往後比較,輸出的第三行開始出現問題。至於那個None,因為你定義函數沒有返回值的原因。
我給你三個函數,你對比一下:
deflist_sort_new(list_in):
forjinrange(len(list_in)-1,0,-1):
foriinrange(0,j):
iflist_in[i]>list_in[i+1]:
list_in[i],list_in[i+1]=list_in[i+1],list_in[i]
returnlist_in
deflist_sort_old(list_in):
forjinrange(len(list_in)-1,0,-1):
foriinrange(0,j):
iflist_in[i]>list_in[i+1]:
list_temp=list_in[i]
list_in[i]=list_in[i+1]
list_in[i+1]=list_temp
returnlist_in
deflist_sort_test(list_in):
forjinrange(len(list_in)-1,0,-1):
foriinrange(0,j):
iflist_in[i]>list_in[i+1]:
print"before>>"+str(list_in[i])
list_in[i]=list_in[i+1]
print"after>>"+str(list_in[i])
list_in[i+1]=list_in[i]
print"and>"+str(list_in[i+1])
returnlist_in
list_test=[2,1,3,44,22,53,25,26]
printlist_test
print"*"*20
print(list_sort_test(list_test))
其中函數list_sort_new()和list_sort_old()都能實現你的目的,其中list_sort_new()中使用了指派運算, 就相當於c語言的i++。 list_sort_old()類似於你的想法,其中j的for實現了全部比較,而倒序減少了不必要的比較,list_sort_test()告訴了你,為什麼需要一個變數來充當緩存。
住好運。。。。
❽ python包含什麼演算法
Python基礎演算法有哪些?
1.
冒泡排序:是一種簡單直觀的排序演算法。重復地走訪過要排序的數列,一次比較兩個元素,如果順序錯誤就交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該排序已經完成。
2.
插入排序:沒有冒泡排序和選擇排序那麼粗暴,其原理最容易理解,插入排序是一種最簡單直觀的排序演算法啊,它的工作原理是通過構建有序序列,對於未排序數據在已排序序列中從後向前排序,找到對應位置。
3.
希爾排序:也被叫做遞減增量排序方法,是插入排序的改進版本。希爾排序是基於插入排序提出改進方法的排序演算法,先將整個待排序的記錄排序分割成為若干個子序列分別進行直接插入排序,待整個序列中的記錄基本有序時,再對全記錄進行依次直接插入排序。
4. 歸並排序:是建立在歸並操作上的一種有效的排序演算法。該演算法是採用分治法Divide and的一個非常典型的應用。
5. 快速排序:由東尼·霍爾所發展的一種排序演算法。又是一種分而治之思想在排序演算法上的典型應用,本質上快速排序應該算是冒泡排序基礎上的遞歸分治法。
6.
堆排序:是指利用堆這種數據結構所設計的一種排序演算法。堆積是一個近似完全二叉樹的結構,並同時滿足堆積的性質,即子結點的鍵值或索引總是小於它的父結點。
7.
計算排序:其核心在於將輸入的數據值轉化為鍵存儲在額外開辟的數組空間中,作為一種線性時間復雜度的排序,計算排序要求輸入的數據必須是具有確定范圍的整數。