歸并排序與快速排序總結-c++

一,歸并排序

歸并排序(Merge sort)是建立在歸并操作上的一種有效的排序算法。該算法分治法(Divide and Conquer)的一個非常典型的應用。

作為一種典型的分而治之思想的算法應用,歸并排序的實現由兩種方法:

1.自上而下的遞歸(所有遞歸的方法都可以用迭代重寫)
2.自下而上的迭代
1.基本思想

歸并排序(MERGE-SORT)是建立在歸并操作上的一種有效的排序算法。將已有序的子序列合并,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合并成一個有序表,稱為二路歸并。

在這里插入圖片描述
簡而言之,先通過遞歸的思想將數組分成一個一個的不可再分的子序列,接下來再對其中兩個子序列按照升序或者降序合并,重復直到合并所有子序列合并完成。(子問題其實就是兩個有序數組的合并)。

2.程序實現
#include<iostream>
using namespace std;
#define eleType int//合并兩個有序子序列
/*
參數含義: arr數組, left:序列的左邊起始點 mid:中間下標 right:右邊結束點
通過left mid right 將arr分成左右兩個區域
*/
void merge(eleType *arr,int left,int mid,int right){int i = left, j = mid + 1;  // i為左邊區域的指針 j 為右邊區域的指針eleType *temp = new eleType[right + 1]; //臨時數組,用來臨時存放排序后的數字int index = 0; //臨時數組的下標while(i <= mid && j <= right){ //當左右區域都有未比完的數字temp[index++] = arr[i] < arr[j] ? arr[i++] : arr[j++]; //選擇較小的存入temp數組}while(i <= mid){ //當僅剩左邊區域temp[index++] = arr[i++]; // 按順序存入temp}while(j <= right){ //當僅剩右邊區域temp[index++] = arr[j++]; //按順序存入temp}for(int i = 0; i < index; i++){ //將temp重新放回arrarr[left + i] = temp[i];}delete [] temp; //刪除臨時temp數組
}
//歸并排序
/* 參數含義: left:最左邊下標  right : 最右邊的下標通過left 和right 計算出中間數的下標
*/
void mergesort(eleType *arr,int left,int right){if(left < right){ //遞歸條件int mid = left + (right - left) / 2; //計算中間下標mergesort(arr,left,mid); //遞歸劃分左邊區域mergesort(arr,mid + 1, right);//遞歸劃分右區域merge(arr,left,mid,right); //執行合并}
}
3.優缺點:

優點
穩定性: 穩定的排序算法,即相同元素的相對順序在排序前后保持不變。
最佳、平均和最壞時間復雜度:歸并排序在所有情況下(包括輸入數組已排序或逆序)的時間復雜度都是O(n log n),n是數組的大小。它在處理大數據集時非常高效。
空間復雜度:雖然歸并排序需要額外的空間來存儲臨時子數組,但它的空間復雜度是O(n),在實際應用中通常是可以接受的。
缺點
空間復雜度:雖然O(n)的空間復雜度可以接受的,但對于內存受限的環境或需要就地排序的場合,歸并排序不是最佳選擇。
數據移動次數:歸并排序在合并過程中可能需要大量的數據移動操作,這可能導致在某些情況下效率較低。
不適合小數據集:對于非常小的數據集,歸并排序的額外空間開銷和遞歸調用相對于其他簡單排序算法效率較低。但是在大數據集上,歸并排序的O(n log n)時間復雜度遠優于這些簡單排序算法。
遞歸深度:歸并排序是遞歸算法,對于非常大的數據集,遞歸深度可能會很大,可能導致棧溢出。

二,快速排序

1.基本思想

通過一次排序將待排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另一部分的所有數據都要小,然后再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
在這里插入圖片描述

2.實現步驟
  • 1.選擇一個基準元素(pivot):通常選擇待排序序列的第一個或最后一個元素作為基準。
  • 2.分割過程:將序列中小于基準的元素放在基準的左邊,大于基準的元素放在基準的右邊。這個過程稱為分區(partition)操作,分區結束后基準元素所處的位置就是其在已排序序列中的正確位置。
  • 3.遞歸排序:分別對基準左右兩邊的子序列進行快速排序。
3.代碼實現
#include<iostream>
using namespace std;
#define eleType int
/* 劃分 將比基準數大的放右邊,比基準數小的放左邊
參數含義: arr數組,left:最左邊的下標 right: 最右邊的下標
*/int getKeyPositon(eleType *arr,int left,int right){int key = arr[left]; //將第一個數作為基準數while(left < right){while(arr[right] >= key && left < right){ //右邊先移動,找比基準數小的right--;}arr[left] = arr[right]; //找到之后賦值給左邊left的位置while(arr[left] <= key && left < right){ //之后左邊移動,找比基準數大的left++;}arr[right] = arr[left];//找到之后賦值給右邊right的位置}arr[left] = key; //左右指針相遇之后,將基準數放回相遇的位置return left; //返回基準數的位置
}
/*
排序過程,不停的基準數放到正確位置
參數含義: arr數組,left:最左邊的下標 right: 最右邊的下標
*/
void quickSort(eleType *arr,int left,int right){if(left < right){ //遞歸條件int position = getKeyPositon(arr,left,right); //基準數歸位之后,數組被分成左右兩部分quickSort(arr,left,position - 1); //對左邊部分排序quickSort(arr,position + 1,right); //對右邊部分排序}
}
優缺點

優點:
速度快:在平均情況下,快速排序的時間復雜度為O(n log n),比許多排序算法都要快。
原地排序:只需要一個很小的棧空間來保存遞歸的調用,不需要額外的存儲空間。
缺點:
最壞情況:在最壞情況下(輸入數據已經有序或接近有序),快速排序的時間復雜度會退化到O(n^2)。
空間復雜度:雖然快速排序是原地排序,但在遞歸調用時可能會占用較大的棧空間。對于非常大的數據集,會導致棧溢出。
對基準元素的選擇敏感:基準元素的選擇會影響到排序的性能。如果每次選擇的基準元素都是序列中最小或最大的元素,排序的效率就會降低。

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

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

相關文章

KVM網絡模式設置

一、KVM網絡模式介紹 1、NAT ( 默認上網 ) 虛擬機利用host機器的ip進行上網,對外顯示一個ip;virbr0是KVM 默認創建的一個 Bridge,其作用是為連接其上的虛機網卡提供NAT訪問外網的功能,默認ip為192.168.122.1 2、自帶的Bridge 將虛擬機橋接到host機器的網卡上,vm和ho…

mysql如何一句實現二行數據的列對換?

二行數據相同列內容對換 思路&#xff1a;先用多表聯查的方式查詢出這二行數據&#xff0c;再將查詢改成修改語句&#xff0c;需要對換的列相互設置值。 //查詢 SELECT * fromser_ele_detail AS rule1JOIN ser_ele_detail AS rule2 ON ( rule1.account_no rule2.account_no …

240622_昇思學習打卡-Day4-ResNet50遷移學習

240622_昇思學習打卡-Day4-ResNet50遷移學習 我們對事物的認知都是一點一點積累出來的&#xff0c;往往借助已經認識過的東西&#xff0c;可以更好地理解和認識新的有關聯的東西。比如一個人會騎自行車&#xff0c;我們讓他去騎摩托車他也很快就能學會&#xff0c;比如已經學會…

使用容器部署redis_設置配置文件映射到本地_設置存儲數據映射到本地_并開發java應用_連接redis---分布式云原生部署架構搭建011

可以看到java應用的部署過程,首先我們要準備一個java應用,并且我們,用docker,安裝一個redis 首先我們去start.spring.io 去生成一個簡單的web項目,然后用idea打開 選擇以后下載 放在這里,然后我們去安裝redis 在公共倉庫中找到redis . 可以看到它里面介紹說把數據放到了/dat…

理解和實現 LFU 緩存置換算法

引言 在計算機科學中&#xff0c;緩存是一種重要的技術&#xff0c;用于提高數據訪問速度和系統性能。然而&#xff0c;由于緩存空間有限&#xff0c;當緩存滿了之后&#xff0c;就需要一種智能的策略來決定哪些數據應該保留&#xff0c;哪些應該被淘汰。LFU&#xff08;Least…

FLASH閃存

FLASH閃存 程序現象&#xff1a; 1、讀寫內部FLASH 這個代碼的目的&#xff0c;就是利用內部flash程序存儲器的剩余空間&#xff0c;來存儲一些掉電不丟失的參數。所以這里的程序是按下K1變換一下測試數據&#xff0c;然后存儲到內部FLASH&#xff0c;按下K2把所有參數清0&…

找不到mfc140u.dll怎么修復,mfc140u.dll丟失的多種修復方法

計算機丟失mfc140u.dll文件會導致依賴該文件的軟件無法正常運行。mfc140u.dll是Microsoft Visual C 2015的可再發行組件之一&#xff0c;它屬于Microsoft Foundation Class (MFC) 庫&#xff0c;許多使用MFC開發的程序需要這個DLL文件來正確執行。丟失了mfc140u.dll文件。會導致…

無人機無刷電機理論教學培訓課程

本文檔為一份關于Brushless電機理論的詳細教程&#xff0c;由TYTO Robotics編制&#xff0c;旨在幫助用戶理解brushless電機的工作原理、特性以及如何通過實驗測定其關鍵參數Kv和Kt。文檔首先介紹了brushless電機的基本組成&#xff0c;包括靜止的定子和旋轉的轉子&#xff0c;…

AR增強現實在橋梁工程專業課堂上的應用

橋梁工程專業課堂上應用增強現實技術具有多方面的優勢。首先&#xff0c;增強現實技術能夠提供更加直觀、生動、真實的橋梁工程學習環境&#xff0c;使學生能夠更好地理解和掌握橋梁工程的基本原理和設計方法。其次&#xff0c;增強現實技術能夠提供更加豐富的橋梁工程案例和實…

考研數學|線代零基礎,聽誰的課比較合適?

線性代數是數學的一個重要分支&#xff0c;對于考研的學生來說&#xff0c;掌握好這門課程是非常關鍵的。由于你之前沒有聽過線性代數課&#xff0c;選擇一個合適的課程和老師就顯得尤為重要。 以下是一些建議&#xff0c;希望能幫助你找到合適的課程資源。 首先&#xff0c;…

Hadoop3:MapReduce中的ETL(數據清洗)

一、概念說明 “ETL&#xff0c;是英文Extract-Transform-Load的縮寫&#xff0c;用來描述將數據從來源端經過抽取&#xff08;Extract&#xff09;、轉換&#xff08;Transform&#xff09;、加載&#xff08;Load&#xff09;至目的端的過程。ETL一詞較常用在數據倉庫&#…

python學習 - 設計模式 - 狀態模式

大話設計模式 設計模式——狀態模式 狀態模式(State Pattern):當一個對象的內在狀態改變時允許改變其行為&#xff0c;這個對象看起來像是改變了其類 應用場景:當控制一個對象的狀態轉換的條件表達式過于復雜時,把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,可以把復雜的…

LED顯示屏的點間距越小越好嗎

引言 在LED顯示屏市場日趨成熟的同時&#xff0c;小間距顯示屏成為了許多用戶的首選。然而&#xff0c;點間距真的是越小越好嗎&#xff1f;本文將探討這一問題&#xff0c;并提供全面的選購指南。 點間距&#xff1a;并非越小越好 小間距顯示屏因其精細的顯示效果而備受青睞。…

剪輯如何剪輯制作視頻短視頻剪輯學習怎么學,難嗎?

工欲善其事必先利其器&#xff0c;有一個好的工具能讓你的工作如魚得水&#xff0c;果你想在短視頻中制作精良的視頻&#xff0c;你就考慮電腦制作軟件了。果你想制作精良的視頻&#xff0c;你就考慮電腦制作軟件了。 如何找到剪輯軟件了&#xff1f;你可以直接去軟件的官方。你…

KT6368A-sop8藍牙主機芯片獲取電動車胎壓傳感器數據功能

KT6368A藍牙芯片新增主機模式&#xff0c;掃描周邊的胎壓傳感器&#xff0c;這里扮演的角色就是觀察者。因為測試胎壓傳感器&#xff0c;發現它的廣播模式可發現&#xff0c;不可連接 胎壓傳感器部分的手冊說明如下&#xff0c;關于藍牙部分的協議 實際藍牙芯片收到的數據&…

國密算法SM1 SM2 SM3 SM4 SM9

一、概述 SM1-無具體實現 SM1作為一種對稱加密算法&#xff0c;由于其算法細節并未公開&#xff0c;且主要在中國國內使用&#xff0c;因此在國際通用的加密庫&#xff08;如Bouncy Castle&#xff09;中并不直接支持SM1算法。 SM1算法的具體實現涉及國家密碼管理局的規范&…

Studying-代碼隨想錄訓練營day20| 235.二叉搜索樹的最近公共祖先、701.二叉搜索樹中的插入操作、450.刪除二叉搜索樹中的節點

第二十天&#xff0c;二叉樹part07&#xff0c;二叉樹搜索樹加油加油&#x1f4aa; 目錄 235.二叉搜索樹的最近公共祖先 701.二叉搜索樹中的插入操作 450.刪除二叉搜索樹中的節點 拓展&#xff1a;普通二叉樹的刪除方式 總結 235.二叉搜索樹的最近公共祖先 文檔講解&…

潔凈室(區)浮游菌檢測標準操作規程及GB/T 16292-2010測試方法解讀

潔凈室(區)空氣中浮游菌的檢測。潔凈區浮游菌檢測是一種評估和控制潔凈區(如實驗室、生產車間等)內空氣質量的方法。這種檢測的目的是通過測量空氣中的微生物(即浮游菌)數量&#xff0c;來評估潔凈區的清潔度或污染程度。下面中邦興業小編帶大家詳細看下如何進行浮游菌采樣檢測…

RK3568技術筆記九 編譯Linux詳細介紹

在編譯前需要按照前面的方法始化編譯環境&#xff0c;否則會導致編譯失敗&#xff08;若配置過則無需重復配置&#xff09;。 全自動編譯包含所有鏡像編譯&#xff0c;包括&#xff1a;uboot編譯、Kernel編譯、Recovey編譯、文件系統編譯、編譯完成鏡像的更新與打包。 按照前面…

閱讀筆記——《Large Language Model guided Protocol Fuzzing》

【參考文獻】Meng R, Mirchev M, Bhme M, et al. Large language model guided protocol fuzzing[C]//Proceedings of the 31st Annual Network and Distributed System Security Symposium (NDSS). 2024.&#xff08;CCF A類會議&#xff09;【注】本文僅為作者個人學習筆記&a…