3. 排序算法代碼-python

目錄

  • 1.冒泡排序
  • 2.快速排序
  • 3.插入排序
  • 4.希爾排序
  • 5.選擇排序
  • 6.堆排序
  • 7.歸并排序
  • 8. 二分查找

1.冒泡排序

'''冒泡排序'''"""
def BubbleSort(nums):listLength = len(nums)while listLength > 0:for i in range(listLength - 1):if nums[i] > nums[i+1]:nums[i], nums[i+1] = nums[i+1], nums[i]listLength -= 1return nums
"""def BubbleSort(nums):for i in range(len(nums)):for j in range(len(nums) - i - 1):if nums[j] > nums[j+1]:nums[j], nums[j+1] = nums[j+1], nums[j]return numsnums = [5, 2, 8, 4, 7, 4, 3, 9, 2, 0, 16,1]
print(BubbleSort(nums))

2.快速排序

'''快速排序'''def QuickSort(nums, start, end):if start < end:i, j = start, endbase = nums[i]while i < j:while i < j and nums[j] >= base:j -= 1nums[i] = nums[j]while i < j and nums[i] <= base:i += 1nums[j] = nums[i]nums[i] = baseQuickSort(nums, start, i - 1)QuickSort(nums, i+1, end)nums = [9,4,10,8,13,2,15,7]
QuickSort(nums, 0, len(nums)-1)
print(nums)

3.插入排序


'''插入排序'''def InsertSort(nums):for i in range(len(nums)-1):if nums[i] > nums[i+1]:while i>=0 and nums[i] > nums[i+1]:nums[i], nums[i+1] = nums[i+1], nums[i]i -= 1return nums
nums = [9,4,10,8,13,2,15,7]
print(InsertSort(nums))

4.希爾排序

'''希爾排序'''
#①第一層循環 gap折半 直到gap=1
#②二層三層循環直接插入排序
def ShellSort(nums):gap = len(nums) // 2while gap >= 1:for i in range(gap, len(nums)):for j in range(i-gap, -1, -gap):if nums[j] > nums[j+gap]:nums[j], nums[j+gap] = nums[j+gap], nums[j]gap = gap // 2return nums
nums = [9,4,10,8,13,2,15,7]
print(ShellSort(nums))

5.選擇排序

'''選擇排序'''
def SelectSort(nums):for i in range(len(nums)):for j in range(i+1, len(nums)):if nums[j] < nums[i]:nums[j], nums[i] = nums[i], nums[j]return nums
nums = [5, 2, 8, 4, 7, 4, 3, 9, 2, 0, 1,16]
print(SelectSort(nums))

6.堆排序

最大堆總是將其中的最大值存放在樹的根節點。
而對于最小堆,根節點中的元素總是樹中的最小值
應用場景
比如求10億個數中的最大的前10個數,時時構建只有10個元素的小頂堆,如果比堆頂小,則不處理;如果比堆頂大,則替換堆頂,然后依次下沉到適當的位置。
比如求10億個數中的最小的前10個數,時時構建只有10個元素的大頂堆,如果比堆頂大,則不處理;如果比堆頂小,則替換堆頂,然后依次下沉到適當的位置。
一般升序采用大頂堆,降序采用小頂堆

'''構造大頂堆'''
def HeapBuild(nums):l = len(nums) - 1# 構造大頂堆,從非葉子節點開始倒序遍歷,因此是l//2 -1 就是最后一個非葉子節點for i in range(len(nums)//2 - 1, -1, -1):HeapSort(nums, i, l)# 上面的循環完成了大頂堆的構造,那么就開始把根節點跟末尾節點交換,然后重新調整大頂堆for j in range(l, -1, -1):nums[0], nums[j] = nums[j], nums[0]HeapSort(nums, 0, j-1)return numsdef HeapSort(nums, i, l):left, right = 2 * i + 1, 2 * i + 2  # 左右子節點的下標index = i# 構造大頂推if left <= l and nums[i] < nums[left]:index = leftif right <= l and nums[left] < nums[right] and nums[i] < nums[right]:index = rightif index != i:nums[i], nums[index] = nums[index], nums[i]HeapSort(nums, index, l)nums = [17, 13, 40 , 22, 31, 14, 33, 56, 24, 19 ,10, 41, 51, 42, 26]
print('使用大頂堆排序:', HeapBuild(nums))'''構造小頂堆'''
def SmallHeapBuild(nums):l = len(nums) - 1# 從非葉子節點開始倒序遍歷,因此是l//2 -1 就是最后一個非葉子節點for i in range(len(nums)//2 - 1, -1, -1):SmallHeapSort(nums, i, l) # 小頂堆構造函數# 上面的循環完成了小頂堆的構造,那么就開始把根節點跟末尾節點交換,然后重新調整大頂堆# 使用小頂堆進行降序,nums[0]是最小的,放到最后for j in range(l, -1 ,-1):nums[0], nums[j] = nums[j], nums[0]SmallHeapSort(nums, 0, j-1)return numsdef SmallHeapSort(nums, i, l):left, right = 2 * i + 1, 2 * i + 2  # 左右子節點的下標index = i# 構建小頂堆if left <= l and nums[i] > nums[left]:index = leftif right <= l and nums[left] > nums[right] and nums[i] > nums[right]:index = rightif index != i:nums[i], nums[index] = nums[index], nums[i]SmallHeapSort(nums, index, l)nums = [17, 13, 40 , 22, 31, 14, 33, 56, 24, 19 ,10, 41, 51, 42, 26]
print('使用小頂堆倒排序', SmallHeapBuild(nums))

7.歸并排序


def MergeBuild(nums):if len(nums) == 1:return numsmid = len(nums) // 2left = nums[:mid]right = nums[mid:]l1 = MergeBuild(left)l2 = MergeBuild(right)return MergeSort(l1, l2)def MergeSort(left, right):res = []while len(left) and len(right):if left[0] < right[0]:res.append(left.pop(0))else:res.append(right.pop(0))res += leftres += rightreturn resif __name__ == '__main__':nums = [5, 2, 8, 4, 7, 4, 3, 9, 2, 0, 1,16]res = MergeBuild(nums)print(res)

8. 二分查找

'''二分查找'''
def BinarySearch(target, nums):low = 0high = len(nums)-1while low <= high:mid = (low + high) // 2if nums[mid] == target:return 'target in nums'elif nums[mid] < target:low = mid + 1else:high = mid - 1return 'target not in nums'
nums = [2, 4, 7, 8, 9, 10, 13, 15, 19]
print(BinarySearch(13, nums))
print(BinarySearch(20, nums))

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/43696.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43696.shtml
英文地址,請注明出處:http://en.pswp.cn/web/43696.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

References in code to package

【IntelliJ IDEA】IDE學習使用&#xff08;不時更新&#xff09;_idea references in code to class-CSDN博客

【筆記】從零開始做一個精靈龍女-畫貼圖階段(上)

此文只是我的筆記&#xff0c;不包全看懂&#xff0c;有問題可評論 PS貼圖加工 1.打開ps 拖入uv圖&#xff0c;新建圖層&#xff0c;設置背景色為灰色&#xff0c;改一下圖層名字 2.按z縮小一下uv圖層&#xff0c;拖入實體uv圖片&#xff08;目的是更好上色&#xff0c;比如…

鴻蒙語言基礎類庫:【@ohos.util.Vector (線性容器Vector)】

線性容器Vector 說明&#xff1a; 本模塊首批接口從API version 8開始支持。后續版本的新增接口&#xff0c;采用上角標單獨標記接口的起始版本。開發前請熟悉鴻蒙開發指導文檔&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md點擊或者復制轉到。 Vect…

云原生(Cloud native)

云原生&#xff08;Cloud native&#xff09; 一 定義 目前比較權威的定義主要來自Pivotal公司和云原生計算基金會&#xff08;Cloud Native Computing Foundation&#xff0c;簡稱CNCF&#xff09;。 1.1 Pivotal 4個要點&#xff1a; DevOps、持續交付、微服務、容器化。六…

【Java后端】Service層讀取yml配置文件中內容

前言 最近寫代碼&#xff0c;看到別人寫的讀取application.yml配置文件中數據&#xff0c;寫的挺規范&#xff0c;挺好的&#xff1b;雖然之前也讀取過yml文件&#xff0c;但用的其他方法&#xff0c;沒這個規范&#xff0c;所以記錄下 正文 假設要讀取視頻地址&#xff0c;…

微信小程序切換商戶號

1.登錄微信公眾平臺小程序 2.功能->微信支付 3.關聯成功后會志一關聯商戶號列表顯示 4.登錄你需要切換的商戶號 在下面選擇你需要開通的產品服務 5.切換到賬戶中心的api安全里面 只需要改變當前下面的配置即可切換小程序的收款商戶號 申請API證書按照官方的指引即可解…

關于redis的運維面試題-2

21. Redis的客戶端連接數限制如何設置&#xff1f; 在Redis中&#xff0c;客戶端連接數的限制可以通過配置文件redis.conf來設置&#xff0c;也可以通過命令行直接設置。以下是如何通過配置文件和命令行來設置Redis客戶端連接數限制的步驟和示例代碼。 通過配置文件設置客戶端…

JS計算某一年的土地租金收入和土地承租支出

涉及到多年的地租 , 例如 2024年5月15日 - 2026年5月15日 , 總承包租金是60000 假設 當前年是2024年 , 則計算2024年5月15日-2024年12月31日的租金收入 , 如果是2025年則是2025年1月1日-2025年12月31日 //示例交易數據 var transactions [ { type: "轉出土地收益&qu…

怎么區分住宅IP還是機房IP?機房IP和住宅IP有哪些不同?

在網絡技術的應用中&#xff0c;IP地址扮演著至關重要的角色。了解IP地址的種類及其特性&#xff0c;對于進行網絡管理、優化網絡安全策略、以及實施數據分析等任務至關重要。本文將深入探討如何區分住宅IP和機房IP&#xff0c;并分析兩者的主要差異。 一、IP地址分類簡介 IP…

pytorch-RNN存在的問題

這里寫目錄標題 1. RNN存在哪些問題呢&#xff1f;1.1 梯度彌散和梯度爆炸1.2 RNN為什么會出現梯度彌散和梯度爆炸呢&#xff1f; 2. 解決梯度爆炸方法3. Gradient Clipping的實現4. 解決梯度彌散的方法 1. RNN存在哪些問題呢&#xff1f; 1.1 梯度彌散和梯度爆炸 梯度彌散是…

【人工智能】深度學習:神經網絡模型

【人工智能】深度學習&#xff1a;神經網絡模型 神經網絡基礎知識 BP神經網絡的概念 單個神經元的結構 CNN模型匯總 LeNet5 模型 AlexNet 模型 VGG模型 Inception Net&#xff08;GoogleNet&#xff09;模型 ResNet &#xff08;殘差網絡&#xff09; RNN模型&#x…

css實現漸進中嵌套漸進的方法

這是我們想要的實現效果&#xff1a; 思路&#xff1a; 1.有一個底色的背景漸變 2.需要幾個小的塊級元素做絕對定位通過漸變filter模糊來實現 注意&#xff1a;這里的采用的定位方法&#xff0c;所以在內部的元素一律要使用絕對定位&#xff0c;否則會出現層級的問題&…

小白攻克歌曲“無名的人”,逐句精研的歌唱訣竅

《無名的人》 作詞&#xff1a;唐恬 作曲&#xff1a;錢雷 演唱&#xff1a;毛不易 今天不講解練習技巧&#xff0c;有需要的可以查看往期文章&#xff0c;我給大家帶一下無名的人&#xff0c;練習一下情感融入。 對于眾多唱歌小白而言&#xff0c;學習歌曲《無名的人》是一…

ctfshow-web入門-文件上傳(web164、web165)圖片二次渲染繞過

web164 和 web165 的利用點都是二次渲染&#xff0c;一個是 png&#xff0c;一個是 jpg 目錄 1、web164 2、web165 二次渲染&#xff1a; 網站服務器會對上傳的圖片進行二次處理&#xff0c;對文件內容進行替換更新&#xff0c;根據原有圖片生成一個新的圖片&#xff0c;這樣…

【Linux】進程優先級 + 環境變量

前言 在了解進程狀態之后&#xff0c;本章我們將來學習一下進程優先級&#xff0c;還有環境變量等。。 目錄 1.進程優先級1.1 為什么要有優先級&#xff1f; 2.進程的其他概念2.1 競爭性與獨立性2.2 并行與并發2.3 進程間優先級的體現&#xff1a;2.3.1 O(1) 調度算法&#xf…

Apache Web安全分析與增強

Apache HTTP Server 概述 Apache HTTP Server(通常簡稱為Apache)是一個開源的Web服務器軟件,由Apache軟件基金會開發和維護。它是全球使用最廣泛的Web服務器之一,支持多種操作系統,包括Unix、Linux、Windows和Mac OS X。以下是Apache Web服務器的詳細概述,包括其功能特點…

數字高壓表0-30kv

最近在制作數字高壓表&#xff0c;自己DIY玩玩&#xff0c;有沒有朋友一起研究看看

SpringCloud--常用組件和服務中心

常用組件 Euroke和nacos 區別 負載均衡 負載均衡策略有哪些 自定義負載均衡策略

【Red Hat 4.6---詳細安裝Oracle 19c】---靜默方式安裝

&#x1f53b; 一、安裝前規劃 規劃項:(本環境) 描述:操作系統版本Red Hat Enterprise Linux Server release 4.6 (Santiago)主機名langtest數據庫版本 Oracle 19c IP規劃10.10.10.164服務器空間要求根據實際要求數據庫名/實例名orcl數據庫塊大小oracle建庫一般設置數據庫塊大…

物業系統自主研發接口測試框架

1、自主研發框架整體設計 1.1、什么是測試框架? 在了解什么是自動化測試框架之前&#xff0c;先了解一下什么叫框架?框架是整個或部分系統的可重用設計&#xff0c;表現為一組抽象構件及構件實例間交互的方法;另一種定義認為&#xff0c;框架是可被應用開發者定制的應用骨架…