首頁 後端開發 Python教學 程式設計師必須掌握的十大排序演算法(上)

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

Aug 15, 2023 pm 02:55 PM
排序演算法



#本期導讀

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

很有必要,

以下為大家介紹十大常用排序演算法的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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

快手雙邊市場的複雜實驗設計問題 快手雙邊市場的複雜實驗設計問題 Apr 15, 2023 pm 07:40 PM

一、問題背景1、雙邊市場實驗介紹雙邊市場,即平台,包含生產者與消費者兩方參與者,雙方相互促進。例如快手有影片的生產者,影片的消費者,兩種身分可能有一定程度重疊。雙邊實驗是在生產者和消費者端組合分組的實驗方式。雙邊實驗有以下優點:(1)可以同時偵測新策略對兩方面的影響,例如產品DAU和上傳作品人數變化。雙邊平台往往有跨邊網路效應,讀者越多,作者越活躍,作者越活躍,讀者也會跟著增加。 (2)可以檢測效果溢出和轉移。 (3)幫助我們更好得理解作用的機制,AB實驗本身不能告訴我們原因和結果之間的關係,只

Vue技術開發中如何進行資料篩選與排序 Vue技術開發中如何進行資料篩選與排序 Oct 09, 2023 pm 01:25 PM

Vue技術開發中如何進行資料篩選和排序在Vue技術開發中,資料篩選和排序是非常常見且重要的功能。透過資料篩選和排序,我們可以快速查詢和展示我們需要的信息,提高用戶體驗。本文將介紹在Vue中如何進行資料篩選和排序,並提供具體的程式碼範例,幫助讀者更好地理解和運用這些功能。一、資料篩選資料篩選是指依照特定的條件篩選出符合要求的資料。在Vue中,我們可以透過comp

谷歌借AI打破十年排序演算法封印,每天被執行數萬億次,網友卻說是最不切實際的研究? 谷歌借AI打破十年排序演算法封印,每天被執行數萬億次,網友卻說是最不切實際的研究? Jun 22, 2023 pm 09:18 PM

整理|核子可樂,褚杏娟接觸過基礎電腦科學課程的朋友們,肯定都曾親自動手設計排序演算法——也就是藉助代碼將無序列表中的各個條目按升序或降序方式重新排列。這是個有趣的挑戰,可行的操作方法也多元。人們曾投入大量時間探索如何更有效率地完成排序任務。作為一項基礎操作,大多數程式語言的標準庫中都內建有排序演算法。世界各地的程式碼庫中使用了許多不同的排序技術和演算法來在線組織大量數據,但至少就與LLVM編譯器配套使用的C++庫而言,排序程式碼已經有十多年沒有任何變化了。近日,GoogleDeepMindAI小組如今開發出一

如何使用C++中的基數排序演算法 如何使用C++中的基數排序演算法 Sep 19, 2023 pm 12:15 PM

如何使用C++中的基數排序演算法基數排序演算法是一種非比較性的排序演算法,它透過將待排序的元素分割成一組有限的數字位元來完成排序。在C++中,我們可以使用基數排序演算法來對一組整數進行排序。以下我們將詳細討論如何實作基數排序演算法,並附上具體的程式碼範例。演算法思想基數排序演算法的想法是將待排序的元素分割成一組有限的數字位,然後依序對每個位上的元素進行排序。在每個位元上的排序完

如何實作C#中的選擇排序演算法 如何實作C#中的選擇排序演算法 Sep 20, 2023 pm 01:33 PM

如何實現C#中的選擇排序演算法選擇排序(SelectionSort)是一種簡單直觀的排序演算法,其基本思想是每次從待排序元素中選擇最小(或最大)的元素,放到已排序的序列末尾。透過重複這個過程,直到所有元素都排序完成。下面我們來詳細了解如何在C#中實作選擇排序演算法,同時附上具體的程式碼範例。建立選擇排序方法首先,我們需要建立一個用於實作選擇排序的方法。此方法接受一

Swoole進階:如何使用多執行緒實作高速排序演算法 Swoole進階:如何使用多執行緒實作高速排序演算法 Jun 14, 2023 pm 09:16 PM

Swoole是一款基於PHP語言的高效能網路通訊框架,它支援多種非同步IO模式和多種高階網路協定的實作。在Swoole的基礎上,我們可以利用其多執行緒功能來實現高效率的演算法運算,例如高速排序演算法。高速排序演算法(QuickSort)是一種常見的排序演算法,透過定位一個基準元素,將元素分成兩個子序列,小於基準元素的放在左側,大於等於基準元素的放在右側,再對左右子序列遞迴

不同 PHP 數組排序演算法的應用場景探討 不同 PHP 數組排序演算法的應用場景探討 Apr 28, 2024 am 09:39 AM

針對不同場景,選擇合適的PHP數組排序演算法至關重要。冒泡排序適用於小規模數組無穩定性要求的情況;快速排序在大多數情況下時間複雜度最低;歸併排序穩定性高,適用於需要穩定結果的場景;選擇排序適用於無穩定性要求的情況;堆排序高效率找出最大或最小值。透過實戰案例比較,快速排序在時間效率上優於其他演算法,但需要考慮穩定性時應選擇歸併排序。

數組的排序演算法有哪些? 數組的排序演算法有哪些? Jun 02, 2024 pm 10:33 PM

數組排序演算法用於按特定順序排列元素。常見的演算法類型包括:冒泡排序:透過比較相鄰元素交換位置。選擇排序:找出最小元素交換到目前位置。插入排序:逐一插入元素到正確位置。快速排序:分治法,選擇樞紐元素劃分數組。合併排序:分治法,遞歸排序和合併子數組。

See all articles