程式設計師必須掌握的十大排序演算法(上)
排序演算法可以說是每個程式設計師都必須得掌握的了, 弄清楚它們的原理和實作
很有必要,以下為大家介紹十大常用排序演算法的python實作方式,方便大家學習。
#01 冒泡排序——交換類別排序02 快速排序——交換類別排序
#03 選擇排序-選擇類別排序#04 堆排序——選擇類別排序
#05 插入排序——插入類別排序
#06 希爾排序-插入類別排序
07 歸併排序-歸併類別排序
###08 計數排序-分佈類別排序######09 基數排序-分佈類別排序
10 桶排序-分散類別排序
一個經典的排序演算法,因在演算法運行中,極值會像水底的氣泡一樣逐漸冒出來,因此而得名。
演算法原理:
-
#######比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。 ##################對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數字。 ##################針對所有的元素重複以上的步驟,除了最後一個。 ##################持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。 ######
'''冒泡排序''' 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]
##快速排序(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]
#在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末端。
以此類推,直到所有元素都排序完畢。
'''选择排序''' 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('result list: ', result) # result list: [5, 10, 13, 30, 49, 51, 55, 65, 76, 79]
将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。
'''插入排序''' 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('result list: ', result) # result list: [5, 10, 26, 31, 35, 42, 47, 51, 53, 80]
创建一个堆 H[0……n-1];
把堆首(最大值)和堆尾互换;
把堆的尺寸缩小 1,并调用 shift_down(0),目的是把新的数组顶端数据调整到相应位置;
重复步骤 2,直到堆的尺寸为 1。
'''堆排序''' 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('result list: ', result) # result list: [4, 5, 21, 26, 46, 53, 72, 75, 83, 86]
以上是程式設計師必須掌握的十大排序演算法(上)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

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

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

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

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

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

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

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

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