帶你掌握4種Python 排序算法

摘要:在編程裏,排序是一個重要算法,它能夠幫助咱們更快、更容易地定位數據。在這篇文章中,咱們將使用排序算法分類器對咱們的數組進行排序,瞭解它們是如何工做的。

本文分享自華爲雲社區《Python 排序算法指南》,原文做者:唐裏 。python

在編程裏,排序是一個重要算法,它能夠幫助咱們更快、更容易地定位數據。在這篇文章中,咱們將使用排序算法分類器對咱們的數組進行排序,瞭解它們是如何工做的。爲了保障本文的可讀性,這裏只着重介紹4個排序算法。算法

  • 冒泡排序
  • 插入排序.
  • 歸併排序.
  • 快速排序

冒泡排序

冒泡排序是一種簡單的排序算法,它比較兩個相鄰對象的順序,將非預期順序的相鄰對象位置交換。下面是它的工做步驟:編程

  • 比較第一個和第二個對象,若是第一個大於第二個,將之交換。
  • 將第二個對象和第三個對象進行比較,檢查相同條件。以此類推直到比較到數組最後一個數。
  • 重複執行這個過程,這樣數組就按照從左到右從小到大排列了。

 

 

 

 

代碼以下數組

# Python中的冒泡排序
def bubbleSort(array):
 
  # 外循環訪問數組的每一個元素
  for i in range(len(array)):

    # 內循環將數組元素與外循環迭代元素進行比較
    for j in range(0, len(array) - i - 1):

      # 比較兩個相鄰元素
      if array[j] > array[j + 1]:

        # 若是元素不是預期順序則交換元素
        temp = array[j]
        array[j] = array[j+1]
        array[j+1] = temp
data = [5, 4, 3, 2, 1]

bubbleSort(data)
print('Sorted Array')
print(data)

#output: [1, 2, 3, 4, 5]

插入排序

插入排序也很簡單,它分爲已經排序和未排序兩部分,將未排序部分的元素選中後正確放置在排序部分便可。相似卡牌遊戲時咱們手裏有分類卡。下面是它的工做步驟:ide

  • 遍歷數組查找最低元素的索引並將其與數組的第一個元素交換。
  • 找到數組(不包括第一個元素)中另外一個最低的元素,並將其與第二個元素交換 ,而後重複操做,直到數組的最後一個元素。
  • 這樣,數組中最低的元素都會移到左邊,而最大的元素會在數組的右邊,所以數組是有序的。

代碼以下ui

# Python中的排序算法
def insertionSort(array):
    for step in range(1, len(array)):
        key = array[step]
        j = step - 1
        # 將鍵與其左側的每一個元素進行比較,直到找到小於它的元素
        while j >= 0 and key < array[j]:
            array[j + 1] = array[j]
            j = j - 1
        # 將鍵放在比它小的元素以後。
        array[j + 1] = key

data = [11, 4, 3, 2, 12]

insertionSort(data)
print("sorted array")
print(data)

#output: [2, 3, 4, 11, 12]

歸併排序

歸併排序是基於分治算法原理的最經常使用的排序算法。咱們將數組分爲多個部分,而後對他們進行排序,最後將子部分合併爲一個排序數組,爲了更好的理解,下面是它的工做步驟:url

  • 把數組分紅小塊,直到每一塊中沒有單獨的元素。
  • 比較每一塊數組,將最小值放在左側,最大值放在數組的右側。
  • 若是以爲很難理解,看看這個動圖。

代碼以下spa

# Python的歸併排序
def mergeSort(array):
    if len(array) > 1:

        #  r 是將數組分爲兩半後的分割點
        r = len(array)//2
        L = array[:r]
        M = array[r:]

        # 經過遞歸方法對兩半進行排序
        mergeSort(L)
        mergeSort(M)

        i = j = k = 0

        # 直到咱們到達 L 或 M 的任一端,從中選擇較大的元素 L 和 M 並將它們放置在 A[p 到 r] 處的正確位置
        while i < len(L) and j < len(M):
            if L[i] < M[j]:
                array[k] = L[i]
                i += 1
            else:
                array[k] = M[j]
                j += 1
            k += 1

        # 將L或者M裏的元素排序好後,將剩餘的元素並放入 A[p to r]
        while i < len(L):
            array[k] = L[i]
            i += 1
            k += 1

        while j < len(M):
            array[k] = M[j]
            j += 1
            k += 1
array = [8, 6, 14, 12, 10, 3]

mergeSort(array)
print("Sorted array: ")
print(array)

#output: [3, 6, 8, 10, 12, 14]

快速排序

與歸併排序同樣,快速排序也是基於分治算法的原理的一種排序算法。它選擇一個元素做爲樞軸,並圍繞樞軸分區數組。下面是它的工做步驟:.net

  • 選擇一個轉折點,這能夠是隨機選擇的。這裏假設咱們選擇數組的最後一個元素做爲軸心。
  • 將全部小於軸心的項目放在左側,大於軸心的項目放在數組右側。
  • 在樞軸的左右兩側重複上面的步驟。

# Python中的快速排序
# 找到分區位置
def partition(array, lowest, highest):

  # 這裏咱們選擇最右的元素做爲樞軸
  pivot = array[highest]

  # 爲最大的元素設置指針
  i = lowest - 1
  # 將每一個元素與樞軸元素對比
  for j in range(lowest, highest):
    if array[j] <= pivot:
      i = i + 1
      # 將 i 處的元素與 j 處的元素交換
      (array[i], array[j]) = (array[j], array[i])

  # 將樞軸元素與 i 指定的較大元素交換
  (array[i + 1], array[highest]) = (array[highest], array[i + 1])

  # 返回分區完成的位置
  return i + 1
def quickSort(array, lowest, highest):
  if lowest < highest:

     # 找到樞軸元素
     # 小於樞軸的元素放左邊
     # 大於樞軸的元素放右邊
    pi = partition(array, lowest, highest)

    # 樞軸左側的遞歸調用
    quickSort(array, lowest, pi - 1)

    # 樞軸右側的遞歸調用
    quickSort(array, pi + 1, highest)
array = [9, 8, 3, 2, 1, 10, 7, 6, 19]

size = len(array)
quickSort(array, 0, size - 1)
print('Sorted Array is below')
print(array)

#output [1, 2, 3, 6, 7, 8, 9, 10, 19]

以上就是本文的所有內容,感謝閱讀,若是對你有幫助但願點個贊~指針

原文地址:https://python.plainenglish.io/a-guide-to-sorting-algorithms-in-python-dfa9436b8527

 

點擊關注,第一時間瞭解華爲雲新鮮技術~

相關文章
相關標籤/搜索