程式設計師必須掌握的十大排序演算法(上)

發布: 2023-08-15 14:55:25
轉載
1129 人瀏覽過


#本期導讀

排序演算法可以說是每個程式設計師都必須得掌握的了, 弄清楚它們的原理和實作

很有必要,

以下為大家介紹十大常用排序演算法的python實作方式,方便大家學習。


#01 冒泡排序——交換類別排序
02 快速排序——交換類別排序


#03 選擇排序-選擇類別排序
#04 堆排序——選擇類別排序

#05 插入排序——插入類別排序

#06 希爾排序-插入類別排序

07 歸併排序-歸併類別排序

###08 計數排序-分佈類別排序######

09 基數排序-分佈類別排序

10 桶排序-分散類別排序



##01
#冒泡排序
#冒泡排序(Bubble Sort): 
  • 一個經典的排序演算法,因在演算法運行中,極值會像水底的氣泡一樣逐漸冒出來,因此而得名。

  • 演算法原理:

  • #######比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。 ##################對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數字。 ##################針對所有的元素重複以上的步驟,除了最後一個。 ##################持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。 ######

#程式碼如下:
#
'''冒泡排序'''
def Bubble_Sort(arr):
    for i in range(1, len(arr)):
        for j in range(0, len(arr)-i):
            if arr[j] > arr[j+1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
    return arr

arr = [29, 63, 41, 5, 62, 66, 57, 34, 94, 22]
result = Bubble_Sort(arr)
print('result list: ', result)
# result list: [5, 22, 29, 34, 41, 57, 62, 63, 66, 94]
登入後複製

#02
快速排序

##快速排序(Quicksort):
透過一趟排序將要排序的資料分割成獨立的兩部分,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個資料變成有序序列,是對冒泡排序演算法的一種改進。
  • 演算法原理:

  • #首先設定一個分界值,透過該分界值將陣列分成左右兩部分。

  • 將大於或等於分界值的資料集中到陣列右邊,小於分界值的資料集中到陣列的左邊。此時,左邊部分各元素都小於或等於分界值,而右邊部分各元素都大於或等於分界值。

然後,左邊和右邊的資料可以獨立排序。左側的陣列數據,又可以取一個分界值,將該部分數據分成左右兩部分,同樣在左邊放置較小值,右邊放置較大值。右側的數組資料也可以做類似處理。

重複上述過程,直到左、右兩個部分各資料排序完成。

程式碼如下:

#########
'''快速排序'''
def Quick_Sort(arr):
    # 递归入口及出口
    if len(arr) >= 2:
        # 选取基准值,也可以选取第一个或最后一个元素
        mid = arr[len(arr) // 2]
        # 定义基准值左右两侧的列表
        left, right = [], []
        # 从原始数组中移除基准值
        arr.remove(mid)
        for num in arr:
            if num >= mid:
                right.append(num)
            else:
                left.append(num)
        return Quick_Sort(left) + [mid] + Quick_Sort(right)
    else:
        return arr

arr = [27, 70, 34, 65, 9, 22, 47, 68, 21, 18]
result = Quick_Sort(arr)
print('result list: ', result)
# result list: [9, 18, 21, 22, 27, 34, 47, 65, 68, 70]
登入後複製
######################

03
選擇排序
選擇排序(Selection sort):是一種簡單直覺的排序演算法。 無論什麼資料進去都是 O(n²) 的時間複雜度。所以用到它的時候,資料規模越小越好。

演算法原理:
  • #在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。

  • 從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末端。

  • 以此類推,直到所有元素都排序完畢。


代码如下:
'''选择排序'''
def Selection_Sort(arr):
    for i in range(len(arr) - 1):
        # 记录最小数的索引
        minIndex = i
        for j in range(i + 1, len(arr)):
            if arr[j] < arr[minIndex]:
                minIndex = j
        # i 不是最小数时,将 i 和最小数进行交换
        if i != minIndex:
            arr[i], arr[minIndex] = arr[minIndex], arr[i]
    return arr

arr = [5, 10, 76, 55, 13, 79, 49, 51, 65, 30]
result = Quick_Sort(arr)
print(&#39;result list: &#39;, result)
# result list: [5, 10, 13, 30, 49, 51, 55, 65, 76, 79]
登入後複製

04
插入排序
插入排序(Insertion Sort)一般也被称为直接插入排序,是一种最简单直观的排序算法

算法原理:
  • 将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。

  • 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。


代码如下:
&#39;&#39;&#39;插入排序&#39;&#39;&#39;
def Insertion_Sort(arr):
    for i in range(1, len(arr)):
        key = arr[i]
        j = i - 1
        while j >= 0 and key < arr[j]:
            arr[j + 1] = arr[j]
            j -= 1
        arr[j + 1] = key
    return arr

arr = [31, 80, 42, 47, 35, 26, 10, 5, 51, 53]
result = Insertion_Sort(arr)
print(&#39;result list: &#39;, result)
# result list: [5, 10, 26, 31, 35, 42, 47, 51, 53, 80]
登入後複製

05
堆排序
堆排序(Heap sort):是指利用堆这种数据结构所设计的一种排序算法,堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。

算法原理:
  • 创建一个堆 H[0……n-1];

  • 把堆首(最大值)和堆尾互换;

  • 把堆的尺寸缩小 1,并调用 shift_down(0),目的是把新的数组顶端数据调整到相应位置;

  • 重复步骤 2,直到堆的尺寸为 1。


代码如下:
&#39;&#39;&#39;堆排序&#39;&#39;&#39;
def Heapify(arr, n, i):
    largest = i
    # 左右节点分块
    left = 2 * i + 1
    right = 2 * i + 2
    if left < n and arr[i] < arr[left]:
        largest = left
    if right < n and arr[largest] < arr[right]:
        largest = right
    if largest != i:
        # 大小值交换
        arr[i], arr[largest] = arr[largest], arr[i]
        # 递归
        Heapify(arr, n, largest)

def Heap_Sort(arr):
    nlen = len(arr)
    for i in range(nlen, -1, -1):
        # 调整节点
        Heapify(arr, nlen, i)
    for i in range(nlen - 1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]
        # 调整节点
        Heapify(arr, i, 0)
    return arr

arr = [26, 53, 83, 86, 5, 46, 72, 21, 4, 75]
result = Heap_Sort(arr)
print(&#39;result list: &#39;, result)
# result list: [4, 5, 21, 26, 46, 53, 72, 75, 83, 86]
登入後複製

以上是程式設計師必須掌握的十大排序演算法(上)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:Python当打之年
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板