深入分析python 排序

2022-10-04 13:42:35 字數 3145 閱讀 9846

排序是每個開發人員都需要掌握的技能。排序是對程式本身有乙個全面的理解。不同的排序演算法很好地展示了演算法設計上如何強烈的影響程式的複雜度、執行速度和效率。今天的文章和談談大家都熟悉的各種排序使用 python 如何實現,廢話就不多說啦,開幹!

選擇排序

選擇排序一般是將初始值設為初始值,再迴圈後面每個元素與第乙個元素比較,最終篩選出乙個最小或最大值,最後將有序的數值排在前面,每次選擇當前序列的最小值,將其與當前序列的第乙個元素交換位置,每迭代一次,當前序列長度減一。迭代結束,即可得到有序序列。 實現**如下:

def select_s(data):

# 第一層迴圈:取出陣列中的每個元素

for i in range(len(data)):

temp = i # 拿取乙個元素用來比較

# 第二層迴圈:從第i後面的乙個值開始迴圈,與data[i]進行比較

for j in range(i+1,len(data)):

if data[j] < data[temp]:

data[temp], data[j] = data[j], data[temp]

print(data)

呼叫執行結果:

if __name__ == '__main__':

data = [14, 31, 14, 6, 18, 24, 2, 40]

select_s(data)

輸出結果:

[2, 6, 14, 14, 18, 24, 31, 40]

插入排序

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

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

實現**如下:

def insert_s(data):

# 第一層迴圈: 從第二個元素開始迴圈取出元素,取出的元素再與有序區元素進行比較

for i in range(1,len(data)):

tem程式設計客棧p = data[i]

j = i-1

while j>=0 and temp < data[j]:

data[j+1] = data[j]

j = j-1 # 在與前面乙個元素進行比較,所以j 需要減1

# 當j = -1 就跳出迴圈,將temp值賦給第乙個值,即data[0]

data[j+1] = temp

print(data)

呼叫執行結果:

if __name__ == '__main__':

data = [12, 3, 13, 56, 10, 22, 2, 40]

insert_s(data)

輸出結果:

[2, 3, 10, 12, 13, 22, 40, 56]

氣泡排序

氣泡排序(順序形式),從左向右,兩兩比較,如果左邊元素大於右邊,就交換兩個元素的位置。

其中,每一輪排序,序列中最大的元素浮動到最右面。也就是說,每一輪排序,至少確保有乙個元素在正確的位置。

這樣接下來的迴圈,就不需要考慮已經排好序的元素了,每次內層迴圈次數都會減一。

其中,如果有一輪迴圈之後,次序並沒有交換,這時我們就可以停止迴圈,得到我們想要的有序序列了。

def insert_s(data):

# 第一層迴圈: 從第二個元素開始迴圈取出元素,取出的元素再與有序區元素進行比較

for i in range(1,len(data)):

temp = data[i]

j = i-1

while j>=0 a temp < data[j]:

data[j+1] = data[j]

j = j-1 # 在與前面乙個元素進行比較,所以j 需要減1

# 當j = -1 就跳出迴圈,將temp值賦給第乙個值,即data[0]

data[j+1] = temp

print(data)

呼叫執行結果:

if __name__ == '__main__':

data = [12, 3, 13, 56, 10, 22, 2, 40]

insert_s(data)

輸出結果:

[2, 3, 10, 12, 13, 22, 40, 56]

快速排序

首先要打亂序列順序,以防演算法陷入最壞時間複雜度。所以快速排序使用 「分而治之」 的方法。

對於一串串行,首先從中選取乙個數,凡是小於這個數的值就被放在左邊,凡是大於這個數的值就被放在右邊。然後,繼續對左右兩摞進行快速排序。

直到進行快速排序的序列長度小於 2 (即序列中只有乙個值或者空值)。

**如下:

# 快速排序

def partition(data, left, right):

temp = data[left]

while left < right:

# 如果最右邊的值大於中間值,則最右邊值往後退乙個位置,反之,就將值賦值給最左邊位置

while left < right and data[right] >= temp:

right = right - 1

data[left] = data[right]

# 如果最左邊的值小於中間值,則最左邊值往前進乙個位置,反之,就將值賦值給最右邊位置

while left < right and data[left] <= temp:

left = left + 1

data[right] = data[left]

程式設計客棧 # 迴圈結束,即可定位到中間位置,將初始值,程式設計客棧賦值到這個位置

data[left] = temp

return left

def quick_sort(data, left, right):

if left < right:

mid = partition(data, left, right)

quick_sort(data, left, mid)

quick_sort(data, mid + 1, right)

總結示例**python 排序了解一下?

python 深入分析iter函式

在python中迭代物件x時會呼叫iter x 可是,iter函式還有乙個鮮為人知的用法 傳入兩個引數,使用常規的函式或任何可呼叫的物件建立迭代器。這樣使用時,第乙個引數必須是可呼叫的物件,用於不斷呼叫 沒有引數 產出各個值 第二個值是哨符,這是個標記值,當可呼叫的物件返回這個值時,觸發迭代器丟擲s...

IsPostBack深入分析

1 ispostback 介紹 ispostback是 page類有乙個 bool型別的屬性,用來判斷針對當前 form的請求是第一次還是非第一次請求。當 ispostback true時表示非第一次請求,我們稱為 postback,當 ispostback false時表示第一次請求。在 asp....

深入分析ConcurrentHashMap

再多執行緒的情況下,如果使用hashmap,就會導致死迴圈,導致cpu利用率接近100 所以如果是併發的情況不要使用hashmap 導致死迴圈主要是這段 當在多執行緒的情況由於沒有同步導致,著段 在擴容的時候會執行 do while e null 執行緒安全的hashtable 容器 hashtab...