排序——數據結構與算法 總結8

目錄

8.1 排序相關概念

8.2?插入排序

8.2.1 直接插入排序:

8.2.2 折半插入排序:

8.2.3 希爾排序:

8.3?交換排序

8.3.1 冒泡排序:

8.3.2 快速排序:

8.4?選擇排序

8.4.1 簡單選擇排序

8.4.2 堆排序

8.5?歸并排序

8.6?排序算法復雜度


8.1 排序相關概念

  • 排序碼:排序的依據,也稱關鍵碼
  • 排序是對線性結構的一種操作
  • 排序算法的穩定性:假定在待排序的記錄序列中存在多個具有相同關鍵碼的記錄,若經過排序,這些記錄的相對次序保持不變,則稱這種排序算法穩定,否則為不穩定。
  • 根據排序過程中所有記錄是否全部放在內存中,排序方法分為

? ? (1) 內排序:過程中,待排序的所有記錄全部放在內存中

? ? (2) 外排序:過程中,需要在內外存之間交換數據

  • 根據排序方法是否建立在關鍵碼比較的基礎上,排序方法分為:

? ? (1) 基于比較:通過關鍵碼之間的比較和記錄的移動實現。(包括插入排序、交換排序、選擇排序和歸并排序)

? ? (2) 不基于比較:根據待排序數據的特點所采取的其他方法。(基數排序)

8.2?插入排序

8.2.1 直接插入排序:

??? 基本思路:有將數組分為有序區和無序區,初始時有序區只有一個元素,將無序區的元素一個一個插入有序區,直到所有元素都在有序區內。

# 直接插入排序
def InsertSort(R):for i in range(1,len(R)):if R[i]<R[i-1]:temp = R[i]  # 取出無序區的第一個元素j = i-1  # 前面都是有序的,在有序區中找插入的位置while True:R[j+1] = R[j]  # 將大于temp的元素后移,空出一個插入的位置j-=1if j<0 or R[j]<=temp:breakR[j+1] = tempreturn R

8.2.2 折半插入排序:

??? 折半插入排序和直接插入排序思路差不多,不過在將無序區元素插入有序區時用折半的方法插入。只是優化了插入的部分。

8.2.3 希爾排序:

??? 基本思路:先將整個待排序記錄序列分隔成若干個子序列,在子序列內分別進行直接插入排序,待整個序列基本有序后,再對整體記錄進行一次直接插入排序。

??? 步驟:

??? (1) 相鄰d個位置的元素分為一組,d=n/2(d是增量)

??? (2) 將排序序列分為d個組,在各組內進行直接插入排序

??? (3) 遞減d=d/2,重復第二步,直到d=0為止

希爾算法的時間復雜度難以分析,一般認為其平均時間復雜度為O(n1.58)。希爾排序的速度通常要比直接插入排序快。

希爾排序是一種不穩定的排序算法

8.3?交換排序

8.3.1 冒泡排序:

??? 基本思路:兩個元素反序時進行交換

??? 冒小泡:從后往前看,如果后面的比前面的小就交換。

若某一趟沒有出現元素交換,說明所有元素已排好序了。

# 冒泡排序
def BubbleSort(R):for i in range(len(R)-1):exchange = Falsefor j in range(len(R)-1,i,-1):if R[j]<R[j-1]:R[j],R[j-1] = R[j-1],R[j]exchange=Trueif exchange == False:return R

8.3.2 快速排序:

??? 先選擇一個基準(一般是第一個元素),將待排序記錄劃分為兩部分,左側關鍵碼小于基準,右側關鍵碼大于基準,將基準值與左側最后一個值交換位置,使得基準值在中間。然后分別對左右部分重復上述過程,直到排好。

【例題】

快速排序過程可以用遞歸樹表示

#快速排序
def quickSort(lst,l,r):if r<=l:returnq = partition(A,l,r)quickSort(A,l,q-1)quickSort(A,q+1,r)def partition(A,l,r): #將元素進行隨機劃分p = randint(A[l],A[r])A[p],A[r] = A[r],A[p]i = lfor j in range(l,r-1):if A[j]<=A[r]:A[i],A[j] = A[j],A[i]i+=1A[i],A[r] = A[r],A[i]return i

8.4?選擇排序

8.4.1 簡單選擇排序

??? 分為無序區和有序區,每趟在無序區中選出最小的記錄minj,minj和有序區后一個數字交換

??? 是一種不穩定的排序方法

# 簡單選擇排序
def SelectSort(R):for i in range(len(R)-1):minj = ifor j in range(i+1,len(R)):if R[j]<R[minj]:  # 從無序區選最小元素minj = jif minj!=i:R[i],R[minj] = R[minj],R[i]

8.4.2 堆排序

??? 堆是完全二叉樹

??? 堆的存儲是順序的

??? 堆的定義:大根堆,小根堆

??? 大根堆:父結點的關鍵字大于子結點的關鍵字

步驟:

(1)根據序列用廣度優先構建一個完全二叉樹,上濾(自底向上)調整為大根堆

(2)輸出堆頂元素,然后用堆尾元素代替堆頂

(3)從根節點篩選,使其形成一個堆(此時的根節點就是之前的堆尾元素)

??? 篩選:將根節點與左右孩子的較大者進行交換,一直進行到所有子樹均為堆或將調整結點交換到葉子位置。

(4)重復二三步驟(n-1次),得到有序序列

【例題】

8.5?歸并排序

基礎思路:將兩個位置相鄰的有序子序列歸并為一個有序序列

歸并要做?\left \lceil log_2n \right \rceil?趟,每趟歸并時間為O(n)

#歸并排序,給列表A中下標從l到r的區間排序
def mergeSort(A,l,r):if r-l<=1:#邊界條件處理returnmid = (l+r)//2mergeSort(A,l,mid)#遞歸調用mergeSort(A,mid,r)merge(A,l,mid,r)#遞推到當前層def merge(A,l,mid,r): #合并數組A[l,m-1]和A[m,r-1]l = A[l,mid-1]r = A[mid,r-1]k = 0i = 0j = 0while k<=r-l:if l[i]<=r[j]:i +=1A[K] = l[i]else:A[K] = r[j]j+=1k+=1

8.6?排序算法復雜度

基于比較排序算法的平均時間復雜度不可能優于O(nlog_2n)

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

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

相關文章

磁盤就是一個超大的Byte數組,操作系統是如何管理的?

磁盤在操作系統的維度看&#xff0c;就是一個“超大的Byte數組”。 那么操作系統是如何對這塊“超大的Byte數組”做管理的呢&#xff1f; 我們知道在邏輯上&#xff0c;上帝說是用“文件”的概念來進行管理的。于是&#xff0c;便有了“文件系統”。那么&#xff0c;文件系統…

當前國內可用的docker加速器搜集 —— 筑夢之路

可用鏡像加速器 以下地址搜集自網絡&#xff0c;僅供參考&#xff0c;請自行驗證。 1、https://docker.m.daocloud.io2、https://dockerpull.com3、https://atomhub.openatom.cn4、https://docker.1panel.live5、https://dockerhub.jobcher.com6、https://hub.rat.dev7、http…

最新版情侶飛行棋dofm,已解鎖高階私密模式,單身狗務必繞道!(附深夜學習資源)

今天阿星要跟大家聊一款讓阿星這個大老爺們兒面紅耳赤的神奇游戲——情侶飛行棋。它的神奇之處就在于專為情侶設計&#xff0c;能讓情侶之間感情迅速升溫&#xff0c;但單身狗們請自覺繞道&#xff0c;不然后果自負哦&#xff01; 打開游戲&#xff0c;界面清新&#xff0c;操…

HTML5使用<progress>進度條、<meter>刻度條

1、<progress>進度條 定義進度信息使用的是 progress 標簽。它表示一個任務的完成進度&#xff0c;這個進度可以是不確定的&#xff0c;只是表示進度正在進行&#xff0c;但是不清楚還有多少工作量沒有完成&#xff0c;也可以用0到某個最大數字&#xff08;如&#xff1…

vs2022安裝qt vs tool

1 緣由 由于工作的需要&#xff0c;要在vs2022上安裝qt插件進行開發。依次安裝qt&#xff0c;vs2022&#xff0c;在vs2022的擴展管理中安裝qt vs tool。 2 遇到困難 問題來了&#xff0c;在qt vs tool的設置qt version中出現問題&#xff0c;設置msvc_64-bit時出現提示“invali…

西安石油大學 課程習題信息管理系統(數據庫課設)

主要技術棧 Java Mysql SpringBoot Tomcat HTML CSS JavaScript 該課設必備環境配置教程&#xff1a;&#xff08;參考給出的鏈接和給出的關鍵鏈接&#xff09; JAVA課設必備環境配置 教程 JDK Tomcat配置 IDEA開發環境配置 項目部署參考視頻 若依框架 鏈接數據庫格式注…

【中項第三版】系統集成項目管理工程師 | 第 4 章 信息系統架構① | 4.1-4.2

前言 第4章對應的內容選擇題和案例分析都會進行考查&#xff0c;這一章節屬于技術相關的內容&#xff0c;學習要以教材為準。本章分值預計在4-5分。 目錄 4.1 架構基礎 4.1.1 指導思想 4.1.2 設計原則 4.1.3 建設目標 4.1.4 總體框架 4.2 系統架構 4.2.1 架構定義 4.…

Invoice OCR

Invoice OCR 發票識別 其他類型ORC&#xff1a; DIPS_YTPC OCR-CSDN博客

25款404網頁源碼(上)

25款404網頁源碼&#xff08;上&#xff09; 1部分源碼 2部分源碼 3部分源碼 4部分源碼 5部分源碼 6部分源碼 7部分源碼 8部分源碼 9部分源碼 10部分源碼 11部分源碼 12部分源碼 領取完整源碼下期更新 1 部分源碼 <!DOCTYPE html> <html><!-- 優選源碼 gulang.…

數據結構基礎--------【二叉樹基礎】

二叉樹基礎 二叉樹是一種常見的數據結構&#xff0c;由節點組成&#xff0c;每個節點最多有兩個子節點&#xff0c;左子節點和右子節點。二叉樹可以用來表示許多實際問題&#xff0c;如計算機程序中的表達式、組織結構等。以下是一些二叉樹的概念&#xff1a; 二叉樹的深度&a…

Element-UI - el-table中自定義圖片懸浮彈框 - 位置優化

該篇為前一篇“Element-UI - 解決el-table中圖片懸浮被遮擋問題”的優化升級部分&#xff0c;解決當圖片位于頁面底部時&#xff0c;顯示不全問題優化。 Vue.directive鉤子函數已在上一篇中詳細介紹&#xff0c;不清楚的朋友可以翻看上一篇&#xff0c; “Element-UI - 解決el-…

深入刨析Redis存儲技術設計藝術(二)

三、Redis主存儲 3.1、存儲相關結構體 redisServer:服務器 server.h struct redisServer { /* General */ pid_t pid; /* Main process pid. */ pthread_t main_thread_id; /* Main thread id */ char *configfile; /* Absolut…

Interpretability 與 Explainability 機器學習

「AI秘籍」系列課程&#xff1a; 人工智能應用數學基礎人工智能Python基礎人工智能基礎核心知識人工智能BI核心知識人工智能CV核心知識 Interpretability 模型和 Explainability 模型之間的區別以及為什么它可能不那么重要 當你第一次深入可解釋機器學習領域時&#xff0c;你會…

Zabbix配置文件中Server和ServerActive參數講解

目錄 參數總結 實例&#xff1a; Zabbix Server 配置 (zabbix_server.conf) Zabbix Agent 配置 (zabbix_agentd.conf) 配置文件解析 實際應用 Zabbix Server 配置文件 (zabbix_server.conf) 對代理端的影響 1. Server 參數 2. ServerActive 參數 Zabbix Agent 配置文…

ubuntu 22 安裝 lua 環境 編譯lua cjson 模塊

在 windows 下使用 cygwin 編譯 lua 和 cjson 簡直就是災難&#xff0c;最后還是到 ubuntu 下完成了。 1、下載lua源碼&#xff08;我下載的 5.1 版本&#xff0c;后面還有一個小插曲), 直接解壓編譯&#xff0c;遇到一個 readline.h not found 的問題&#xff0c;需要安裝 re…

python使用langchain整合通義千文

首先pip安裝langchain和dashscope pip install langchain pip install langchain_community pip install dashscope --upgrade然后測試一下運行效果 from langchain_community.chat_models.tongyi import ChatTongyi from langchain.schema import HumanMessage #api_key可以…

如何使用C++中的內聯函數和編譯器優化

在C中&#xff0c;內聯函數&#xff08;inline functions&#xff09;是一種請求編譯器嘗試在調用點將函數體展開&#xff0c;而不是按照常規函數調用的方式&#xff08;即產生調用指令、保存寄存器、棧幀操作等&#xff09;來執行的特殊函數。內聯函數主要用于小的、頻繁調用的…

CentOS命令格式及常用命令

在CentOS中&#xff0c;系統目錄結構遵循了標準的Linux文件系統層次結構&#xff08;Filesystem Hierarchy Standard&#xff0c;FHS&#xff09;。下面是CentOS系統中一些重要的目錄及其用途的介紹&#xff1a; 1. /&#xff08;根目錄&#xff09;&#xff1a;整個文件系統的…

207 課程表

題目 你這個學期必須選修 numCourses 門課程&#xff0c;記為 0 到 numCourses - 1 。 在選修某些課程之前需要一些先修課程。 先修課程按數組 prerequisites 給出&#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表示如果要學習課程 ai 則 必須 先學習課程 bi 。 …

ArcGIS Pro SDK (七)編輯 13 注解

ArcGIS Pro SDK &#xff08;七&#xff09;編輯 13 注解 文章目錄 ArcGIS Pro SDK &#xff08;七&#xff09;編輯 13 注解1 注釋構建工具2 以編程方式啟動編輯批注3 更新批注文本4 修改批注形狀5 修改批注文本圖形6 接地到網格 環境&#xff1a;Visual Studio 2022 .NET6 …