數據結構之歸并排序及排序總結

目錄

歸并排序

歸并排序的時間復雜度

?排序的穩定性

排序總結


歸并排序

歸并排序大家只需要掌握其遞歸方法即可,非遞歸方法由于在某些特殊場景下邊界難控制,我們一般很少使用非遞歸實現歸并排序。那么歸并排序的遞歸方法我們究竟是怎樣實現呢?

大家先想象一下這樣一種場景,如果現在有兩個數,我們要將這兩個數排成升序,怎樣呢?很簡單,我們只需要將兩個數進行一次大小的比較即可,比較完之后,小的元素放在前面,大的元素放在后面,其實這就是很簡單的一次歸并排序,兩個素比較之后交換使得兩個元素變得有序的場景我們就稱作一次歸并。

? ? ? ? 我們再次深入分析,如果有兩個元素,這兩個元素可以直接比較,且比較之后兩個數就變得有序,以此類推,如果們要對4個元素進行歸并排序,按照此邏輯,將兩兩分成一組,然后這兩組進行一次比較,比較完成之后,這4個元素應該就變有序了,但是事實真是這樣嗎?通過示意圖為大家講解:

?為什么兩個元素互相比較就可以變得有序呢?

?這是因為當一個數組中只有一個數時,我們就可以稱這個數組是有序的,當數組中有兩個元素時,我們可以將這兩個數每一個數都看成一個數組,此時這兩個數組都是有序的,兩個有序的數組,元素之間依次比較,肯定會將最終的整個數組變得有序,所以,我們要使四個數組變得有序,可以將數組分成左右兩個數組,當我們使左右兩個數組有序時,再將左右兩個數組的元素依次進行比較,這樣,最終四個數組成的數組就會有序。以此,歸并排序的遞歸思路就出來了:

通過四個元素的數組為大家圖示講解歸并排序的思想:?

歸并排序的思想:我們要對一個數組進行歸并排序,使它變得有序,我們就得先將這個數組分成左右兩部分,相對左邊這部分數組進行歸并排序,然后再對右邊這部分數組進行歸并排序,左右兩邊的數組排好序之后,對左右兩個數組的元素進行一次比較,我們也成對左右兩個數組的元素進行歸并,然后整個數組的歸并排序就完成了。

歸并排序的整體代碼:

void _MergeSort(int* a, int left, int right, int* tmp)
{if (left >= right)return;int mid = (right + left) / 2;_MergeSort(a, left, mid, tmp);_MergeSort(a, mid + 1, right, tmp);int begin1 = left, begin2 = mid + 1;int end1 = mid, end2 = right;int i = left;//左右數組有序之后,就需要左右數組進行歸并while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2]){tmp[i++] = a[begin1++];}else{tmp[i++] = a[begin2++];}}//左右兩個數組,當一個數組歸并完時,一個數組可能還沒有歸并完,將沒有歸并完的這個數組的元素依次賦值給中間數組while (begin1 <= end1){tmp[i++] = a[begin1++];}while (begin1 <= end1){tmp[i++] = a[begin2++];}for (int j = 0; j < right + 1; j++){a[j] = tmp[j];}
}
void MergeSort(int* a, int size)
{int* tmp = (int*)malloc(sizeof(int) * size);if (tmp == NULL){printf("malloc fail");exit(-1);}_MergeSort(a, 0, size - 1, tmp);free(tmp);tmp = NULL;
}
int main()
{int arr[] = {99,88,66,77,55,44,33,22,11 };MergeSort(arr,sizeof(arr)/sizeof(int));for (int i = 0; i < sizeof(arr) / sizeof(int); i++){printf("%d ", arr[i]);}return 0;
}

運行截圖:

????????

歸并排序的時間復雜度

時間復雜度:O(N*logN)? ? ?

穩定性:穩定

?排序的穩定性

什么是排序的穩定性呢?

其實就是,在未排序之前,數組中有兩個相同的元素(有順序),如果在排序之后這兩個元素的順序沒有發生變化,則稱這個排序是穩定的,如果排序之后順序發生了變化,我們就稱這個排序算法是不穩定的。

排序總結

? ? ? ? ? 直接插入排序:最好的情況下就是一個有序數組,插入的元素只用跟前面數組的最后一個元素比較,最好復雜度為O(N)。最壞的情況就是一個逆序數組,每個要插入的元素都要和前面的數組元素比較一下,就是等差數列求和O(N^2)
? ? ? ? ? 希爾排序:時間復雜度不好計算,大概是O(N^1.3)
? ? ? ? ? 選擇排序:沒有最好和最壞,編譯器不知道所以,每個元素都和最小的元素比較一次,一趟排序確定了一元素的位置,剩下的元素下一趟繼續進行比較,時間復雜度為等差數列求和O(N^2)
? ? ? ? ? 堆排序:沒有最好和最壞,因為都是從一個大堆或者小堆進行調整,為O(N*logN)
? ? ? ? ? 冒泡排序:有序時,我們有優化,一趟比較下來沒有發生交換,所以終止后面的排序,但是第一趟的相鄰兩個元素都發生了比較,比較了N次,所以最好時間復雜度為O(N),最壞,逆序,等差數列求和O(N^2)
? ? ? ? ?快速排序:最好:每次找到的key都在中間,所以剛好是一個滿二叉樹,高度為logN,每層比較N次,總共比較N*logN次,所以最好為O(N*logN)
? ? ? ? ? ? ? ? ? ? ? ? ? 最壞:一個有序數組,每次找的key都在最左邊,總共N層,比較等差數列求和次,所以最壞為O(N^2)
? ? ? ? ?歸并排序:最好最壞都是O(N*logN)

? ? ? ? 只有快速排序和歸并排序他們倆才會消耗額外額空間,因為遞歸要頻繁的消耗棧幀,且快排非遞歸實現時運用了棧的數據結構。

好了,到此常見的排序算法我們已經全部學寫完成了,排序算法是面試中的重點,大家一定要掌握。

好了,本期的內容到此結束^_^

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

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

相關文章

PHP醫院手術麻醉系統源碼,laravel、vue2 、mysql技術開發,自主知識產權,二開快捷

醫院手術麻醉系統全套源碼&#xff0c;有演示&#xff0c;自主知識產權 技術架構&#xff1a;PHP、 js 、mysql、laravel、vue2 手術麻醉臨床信息管理系統是數字化手段應用于手術過程中的重要組成部分&#xff0c;用數字形式獲取并存儲手術相關信息&#xff0c;既便捷又高效。…

每日一練2023.12.10—— 倒數第N個字符串【PTA】

題目鏈接&#xff1a;L1-050 倒數第N個字符串 題目要求&#xff1a; 給定一個完全由小寫英文字母組成的字符串等差遞增序列&#xff0c;該序列中的每個字符串的長度固定為 L&#xff0c;從 L 個 a 開始&#xff0c;以 1 為步長遞增。例如當 L 為 3 時&#xff0c;序列為 { a…

Qt Creator設置IDE的字體、顏色、主題樣式

Qt是一款開源的、跨平臺的C開發框架&#xff0c;支持Windows、Linux、Mac系統&#xff0c;從1995發布第一版以來&#xff0c;發展迅猛&#xff0c;最開始是用于Nokia手機的Symbian(塞班)系統和應用程序開發&#xff0c;現在是用于嵌入式軟件、桌面軟件(比如WPS、VirtualBox)、A…

【圖論筆記】克魯斯卡爾算法(Kruskal)求最小生成樹

【圖論筆記】克魯斯卡爾算法&#xff08;Kruskal&#xff09;求最小生成樹 適用于 克魯斯卡爾適合用來求邊比較稀疏的圖的最小生成樹 簡記&#xff1a; 將邊按照升序排序&#xff0c;選取n-1條邊&#xff0c;連通n個頂點。 添加一條邊的時候&#xff0c;如何判斷能不能添加…

Python實現PDF-Excel

輕松解決PDF格式轉Excel&#xff08;使用python實現&#xff09; 實現思路&#xff1a; 要將PDF轉換為Excel&#xff0c;可以使用以下步驟&#xff1a; 解析PDF內容&#xff1a;首先&#xff0c;需要使用Python中的第三方庫&#xff08;如PyPDF2、pdfminer等&#xff09;來解…

西南科技大學C++程序設計實驗十二(文件流操作)

一、實驗目的 1. 熟悉文件的基本操作; 2. 在類中添加打開文件、保存文件、讀取文件等處理函數; 二、實驗任務 1. 分析完善程序:主函數創建一個文件對象,每次打開文件,在其尾部添加數據。如果文件不存在,則新建該文件。請將空白處需要完善的功能補充完整。 #include …

mybatis-config.xml的配置

1&#xff1a;MyBatis 的常規配置文件 mybatis-config.xml 包含了對 MyBatis 框架的全局配置&#xff0c;下面是一個常見的示例&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD…

Java代碼重構技巧:提高可維護性和可擴展性

引言&#xff1a; 在軟件開發過程中&#xff0c;代碼重構是一項非常重要的任務。通過對代碼進行重構&#xff0c;可以提高代碼的可維護性和可擴展性&#xff0c;減少代碼的復雜度&#xff0c;增加代碼的可讀性和可測試性。本文將介紹一些常用的Java代碼重構技巧&#xff0c;幫助…

HTML中表格的語法及使用(詳解)

Hi i,m JinXiang ? 前言 ? 本篇文章主要介紹HTML中表格的語法及詳細使用以及部分理論知識 &#x1f349;歡迎點贊 &#x1f44d; 收藏 ?留言評論 &#x1f4dd;私信必回喲&#x1f601; &#x1f349;博主收將持續更新學習記錄獲&#xff0c;友友們有任何問題可以在評論區留…

Java集合框架定義以及整體結構

目錄 一、Java集合框架1.1 什么是java集合框架1.2 集合與數組 二、集合框架具體內容2.1 整體框架2.2 遺留類和遺留接口1.3 集合框架設計特點 參考資料 一、Java集合框架 1.1 什么是java集合框架 Java集合框架&#xff08;Java Collections Framework&#xff09;是Java平臺提…

高云GW1NSR-4C開發板上手使用

1.開發板 核心板&#xff0c;主芯片GW1NSR-LV4CQN48P&#xff0c;絲印文字“奧陶紀Octet&#xff0c;QQ群808770961”&#xff1a; 晶振&#xff1a;27MHz&#xff0c;22引腳 兩個按鍵&#xff1a;靠近中間&#xff0c;23引腳&#xff0c;按下為低電平&#xff1b;靠近外側&…

Flink 讀寫 HBase 總結

前言 總結 Flink 讀寫 HBase 版本 Flink 1.15.4HBase 2.0.2Hudi 0.13.0官方文檔 https://nightlies.apache.org/flink/flink-docs-release-1.17/zh/docs/connectors/table/hbase/ Jar包 https://repo1.maven.org/maven2/org/apache/flink/flink-sql-connector-hbase-2.2/1…

[Linux] yum安裝分布式LNMP架構

1. 在一臺主機安裝nginx&#xff08;192.168.136.120&#xff09; 1.1 搭建nginx相關的yum源 cd /yum.repos.d mkdir bak mv *.repo bak vim /etc/yum.repos.d/nginx.repo [nginx-stable] namenginx stable repo baseurlhttp://nginx.org/packages/centos/7/$basearch/ gpgche…

基于Python+Django+mysql圖書管理系統

基于PythonDjangomysql圖書管理系統 一、系統介紹二、功能展示三、其它系統四、獲取源碼 一、系統介紹 程序開發軟件&#xff1a;Pycharm 數據庫&#xff1a;mysql 采用技術&#xff1a; Django(一個MVT框架&#xff0c;類似Java的SSM框架) 人生苦短&#xff0c;我用Python&a…

【rabbitMQ】rabbitMQ的下載,安裝與配置

目錄 1. 下載Erland 安裝步驟&#xff1a; 配置環境變量&#xff1a; 校驗環境變量配置是否成功 2.下載MQ 安裝步驟&#xff1a; 添加可視化插件 &#xff1a; 啟動&#xff1a; 拒絕訪問 1. 下載Erland 因為rabbitMQ是基于Erland,所以在安裝rabbitMQ之前需要安裝Erla…

WPF(Windows Presentation Foundation)的 ToolBar控件

WPF&#xff08;Windows Presentation Foundation&#xff09;的 ToolBar 是一種用于創建工具欄的控件。 工具欄通常位于應用程序窗口的頂部或側邊&#xff0c;并提供了一組常用的工具按鈕或命令&#xff0c;用于執行特定的操作或訪問特定的功能。 ToolBar 控件是 WPF 中的一個…

【基于NLP的微博情感分析:從數據爬取到情感洞察】

基于NLP的微博情感分析&#xff1a;從數據爬取到情感洞察 背景數據集技術選型功能實現創新點 今天我將分享一個基于NLP的微博情感分析項目&#xff0c;通過Python技術、NLP模型和Flask框架&#xff0c;對微博數據進行清洗、分詞、可視化&#xff0c;并利用NLP和貝葉斯進行情感分…

VoxPoser:使用語言模型進行機器人操作的可組合 3D 值圖

語言是一種壓縮媒介&#xff0c;人們通過它來提煉和傳達他們對世界的知識和經驗。大型語言模型&#xff08;LLMs&#xff09;已成為一種有前景的方法&#xff0c;通過將世界投影到語言空間中來捕捉這種抽象。雖然這些模型被認為在文本形式中內化了可概括的知識&#xff0c;但如…

Vulnhub-DC-6 靶機復現完整過程

一、搭建環境 kali充當攻擊機 ip地址是&#xff1a;192.168.200.14 DC-6充當靶機 &#xff1a; IP地址暫時未知 注意&#xff1a;讓兩臺機器的使用同一種網絡適配器 二、信息收集 1.探索同網段存活的主機、 ①第一種方法 arp-scan -l②第二種方法 netdiscover -i eth0 -…

前端知識筆記(二)———Django與Ajax

特點&#xff1a; 異步提交 局部刷新 例子&#xff1a;github注冊 動態獲取用戶名實時的跟后端確認并實時的展示到前端&#xff08;局部刷新&#xff09; 朝后端發送請求的方式 1.瀏覽器地址欄直接輸入url回車 -----》get請求 2.a標簽的href屬性 -----》get請求 3…