史上最全排序算法整理(2)

本篇文章我們將接著上篇繼續介紹常見的排序算法,有需要的小伙伴可以移步史上最全排序算法整理(1)查看相關內容哦

1.冒泡排序

1.1基本思想

在待排序的一組數中,將相鄰的兩個數進行比較,若前面的數比后面的數大就交換兩數,否則不交換;如此下去,直至最終完成排序。在排序過程中,大的數據往下沉,小的數據往上浮,就像氣泡一樣,于是將這種排序算法形象地稱為冒泡排序。

1.2特性總結

  • 時間復雜度:O(N^2)
  • 空間復雜度:O(1)
  • 穩定性:穩定

1.3代碼實現

void BubbleSort(int* a, int n) 
{for (int j = 0; j < n - 1; j++){int exchange = 0;for (int i = 1; i < n - j; i++){if (a[i - 1] > a[i]){Swap(&a[i - 1], &a[i]);exchange = 1;}}if (exchange == 0)break;}
}

2.快速排序

2.1基本思想

快速排序是Hoare于1962年提出的一種二叉樹結構的交換排序方法。

任取待排序元素序列中的某元素作為基準值,按照該排序碼將待排序集合分割成兩子序列,左子序列中所有元素均小于基準值,右子序列中的所有元素均大于基準值,然后對左右子序列重復該過程,直到所有元素都排列在相應的位置上為止。

2.2優化方法

選擇key時采用三數取中法

遞歸到小子區間的時候,考慮使用插入排序

2.3特性總結

  • 時間復雜度:O(N*logN)
  • 空間復雜度:O(logN)
  • 穩定性:不穩定。其元素比較和交換是跳躍進行的,因此它是一種不穩定的排序算法。

2.4代碼實現

//快排三數取中
int GetMidi(int* a, int left, int right)
{int mid = (left + right) / 2;if (a[left] < a[mid]){if (a[mid] < a[right]){return mid;}else if (a[left] > a[right]){return left;}else{return right;}}else//a[left]>=a[mid]{if (a[mid] > a[right]){return mid;}else if (a[left] < a[right]){return left;}else{return right;}}
}//Hoare
void QuickSort1(int* a, int left, int right) 
{//區間只有一個值或者不存在的就是最小子問題if (left >= right)return;//小區間選擇走插入,可以減少90%左右的遞歸if (right - left + 1 < 10){InsertSort(a + left, right - left + 1);}else{int begin = left, end = right;int midi = Getmidi(a, left, right);Swap(&a[left], &a[midi]);int keyi = left;while (left < right){//right先走找小while (left < right && a[right] >= a[keyi]){right--;}while (left < right && a[left] <= a[keyi]){left++;}Swap(&a[left], &a[right]);}Swap(&a[left], &a[keyi]);keyi = left;QuickSort1(a, begin, keyi - 1);QuickSort1(a, keyi + 1, end);}
}//快速排序-前后指針
void QuickSort2(int* a, int left, int right) 
{if (left >= right)return;int keyi = left;int prev = left;int cur = left + 1;while (cur <= right){if (a[cur] < a[keyi] && ++prev != cur){Swap(&a[prev], &a[cur]);}++cur;}Swap(&a[keyi], &a[prev]);keyi = prev;QuickSort2(a, left, keyi - 1);QuickSort2(a, keyi+1, right);
}

?3.歸并排序

3.1基本思想

歸并排序是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法的典型應用。將已有序的子序列合并,得到完全有序的序列

即先使每個子序列有序,再使子序列段間有序,若將兩個有序表合并成一個有序表,稱為二路歸并。

3.2特性總結

  • 時間復雜度O(N*logN)?
  • 空間復雜度O(N)
  • 穩定性:穩定

3.3代碼實現

void _MergeSort(int* a, int begin, int end, int* tmp)
{if (begin == end)return;int mid = (begin + end) / 2;_MergeSort(a, begin, mid, tmp);_MergeSort(a, mid + 1, end, tmp);int begin1 = begin, end1 = mid;int begin2 = mid + 1,end2 = mid;int i = begin;//依次比較,取較小的尾插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 (begin2 <= end1){tmp[i++] = a[begin2++];}memcpy(a + begin, tmp + begin, sizeof(int) * (end - begin + 1));
}
//歸并
void MergeSort(int* a, int n) 
{int* tmp = (int*)malloc(sizeof(int) * n);if (tmp == NULL){perror("malloc fail");return;}_MergeSort(a, 0, n - 1, tmp);free(tmp);tmp = NULL;
}

3.4歸并排序的非遞歸

?相比于遞歸算法,歸并排序的非遞歸算法不用多次調用同一個函數,不會向遞歸算法一樣因為函數嵌套調用次數太多而造成棧溢出。?相比于遞歸的算法,非遞歸與之不同點就一個:在遞歸中我們通過遞歸到最底層(即兩個數一組)進行排序,而非遞歸則是直接把數組分成兩個數一組進行排序,這邊排序完之后,再把數組分成四個一組排序,直到整個數組被分成兩組,排序后就結束。

void MergeSortNonR(int* a, int n) 
{int* tmp = (int*)malloc(sizeof(int) * n);if (tmp == NULL){perror("malloc fail");return;}int gap = 1;while (gap < n){for (int j = 0; j < n; j += 2 * gap){int begin1 = j, end1 = begin1 + gap - 1;int begin2 = begin1 + gap, end2 = begin2 + gap - 1;//越界處理if (end1 >= n || begin2 >= n)break;if (end2 >= n)end2 = n - 1;int i = j;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 (begin2 <= end1){tmp[i++] = a[begin2++];}memcpy(a + j, tmp + j, sizeof(int) * (end2 - j + 1));}gap *= 2;}free(tmp);tmp = NULL;
}

4.非比較排序之計數排序

前面我們介紹的排序都是通過比較實現的,下面我們來看看一個常見的非比較排序

4.1基本思想

遍歷原數組,統計相同元素出現的個數,一個值出現了幾次,映射的位置次數就被增加幾,然后根據統計的結果將序列回收到原來的序列中。

4.2特性總結

  • 計數排序在數據范圍集中地時候,效率很高,但是適用的范圍很有限
  • 時間復雜度:O(MAX(N,范圍))
  • 空間復雜度:O(范圍)?
  • 穩定性:穩定

4.3代碼實現

void CountSort(int* a, int n)
{int min = a[0], max = a[0];for (int i = 1; i < n; i++){if (a[i] > max)max = a[i];if (a[i] < min)min = a[i];}int range = max - min + 1;//先根據最大值和最小值求出范圍int* count = (int*)malloc(sizeof(int) * range);if (count == NULL){perror("malloc fail");return;}memeset(count, 0, sizeof(int) * range);for (int i = 0; i < n; i++){count[a[i] - min]++;}int j = 0;for (int i = 0; i < range; i++){while (count[i]--){a[j++] = i + min;}}
}

排序算法匯總

以上就是小編對排序算法的全部介紹啦

歡迎大家在評論區留言討論

點贊+評論+關注,是博主不斷更新優質文章的動力哦~

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

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

相關文章

【解決npm install -g windows-build-tools的安裝問題】

解決npm install -g windows-build-tools的安裝問題 https://developer.huawei.com/consumer/cn/forum/topic/0203740461436730610?fid26

gitlab 創建 ssh 和 token

文章目錄 一、創建ssh key二、將密鑰內容復制到gitlab三、創建token 一、創建ssh key 打開控制臺cmd&#xff0c;執行命令 ssh-keygen -t rsa -C xxxxx xxxxx是你自己的郵箱 C:\Users\xx\.ssh 目錄下會創建一個名為id_rsa.pub的文件&#xff0c;用記事本打開&#xff0c;并…

基于深度學習的中文情感分析系統python flask

基于python的畢業設計 基于深度學習的中文情感分析系統(flask)(源碼說明文檔演示) 畢業設計課程設計期末大作業、課程設計、高分必看&#xff0c;下載下來&#xff0c;簡單部署&#xff0c;就可以使用。 包含&#xff1a;項目源碼、數據庫腳本、軟件工具等&#xff0c;該項目…

【Spring Cloud】微服務工程中的服務注冊與發現配置中心-Consul

Catalog Spring Cloud Consul一、需求二、是什么三、優點四、缺點五、怎么用六、細節 Spring Cloud Consul 一、需求 多個微服務之間通過RestTemplate中的api相互調用&#xff0c;一般要寫死微服務的IP地址和端口號&#xff0c;相當于硬編碼&#xff0c;非常不靈活&#xff0…

MyBatis出現:SQLSyntaxErrorException: Unknown column ‘XXX‘ in ‘field list‘

<update id"updateStudent">update tb_students set stu_name${stuName},stu_gender${stuGender},stu_age${stuAge},stu_tel${stuTel}where stu_num ${stuNum}</update> 本質上來說&#xff0c;是Mybatis使用上的錯誤&#xff0c;不熟悉&#xff0c;理…

C#知識|通過ADO.NET實現應用程序對數據庫的增、刪、改操作。

哈嘍,你好啊,我是雷工! 前邊學習了SQLServer數據庫相關的增刪改查的基本操作, 上節練習了C#通過ADO.NET技術和SQLServer數據庫建立連接和斷開連接的寫法, 本節繼續學習ADO.NET的相關操作,下面為向數據庫中插入數據的相關練習筆記。 01 向數據庫插入數據 插入數據的過程…

SQL函數--union all 使用方法及案例

1. 使用方法 在 SQL 中&#xff0c;UNION ALL 操作用于結合兩個或更多 SELECT 語句的結果集&#xff0c;包括所有匹配的行&#xff0c;甚至包括重復的行。這與 UNION 不同&#xff0c;因為 UNION 會自動刪除重復的行。 滿足條件&#xff1a; 1、兩個select查詢的列的數量必須相…

web前端柜架圖片:探索與解析

web前端柜架圖片&#xff1a;探索與解析 在web前端開發的世界里&#xff0c;圖片的處理與展示是一項至關重要的任務。而“web前端柜架圖片”這一概念&#xff0c;可能初聽起來讓人有些困惑&#xff0c;它究竟指的是什么&#xff1f;在本文中&#xff0c;我們將從四個方面、五個…

Ai速遞5.29

全球AI新聞速遞 1.摩爾線程與無問芯穹合作&#xff0c;實現國產 GPU 端到端 AI 大模型實訓。 2.寶馬工廠&#xff1a;機器狗上崗&#xff0c;可“嗅探”故障隱患。 3.ChatGPT&#xff1a;macOS 開始公測。 4.Stability AI&#xff1a;推出Stable Assistant&#xff0c;可用S…

CCF-GESP 等級考試 2023年3月認證C++一級真題

2024年03月真題 一、單選題&#xff08;每題2分&#xff0c;共30分&#xff09; 第 1 題 以下不屬于計算機輸入設備的有&#xff08; &#xff09;。 A. 鍵盤B. 音箱C. 鼠標D. 傳感器 第 2 題 計算機系統中存儲的基本單位用B來表示&#xff0c;它代表的是&#xff08; &#x…

企業網絡的“瑞士軍刀”:探索“一端多能”設備的多面性

在數字化時代&#xff0c;企業網絡需求的復雜性和多樣性不斷增長&#xff0c;傳統的單一功能網絡設備已難以滿足這些需求。企業需要一種集多種功能于一身的“一端多能”網絡設備&#xff0c;以應對各種網絡環境和業務需求&#xff0c;就像是一把多功能、靈活、可靠的瑞士軍刀&a…

一個月速刷leetcodeHOT100 day13 二叉樹結構 以及相關簡單題

樹是一種分層數據的抽象模型 二叉樹 二叉樹中的節點最多只能有兩個子節點&#xff0c;一個是左側子節點&#xff0c;另一個是右側子節點 二叉搜索樹 二叉搜索樹&#xff08;BST&#xff09;是二叉樹的一種&#xff0c;但是只允許你在左側節點存儲&#xff08;比父節點&…

測試基礎07:測試工作流程規范、進度同步與把控

課程大綱 1、迭代測試流程 2、測試流程 2.1、測試用例評審 目的&#xff1a;對齊產品需求理解&#xff0c;完善、優化測試場景。 參與方&#xff1a;項目、產品、開發、測試。 用例內容&#xff1a;冒煙用例&#xff08;主流程&#xff09; 功能用例。 2.2、冒煙測試 提測…

SOLIDWORKS正版價格多少錢

SOLIDWORKS作為目前應用較為廣泛的3D CAD軟件之一&#xff0c;具有強大的功能和實用性&#xff0c;它為各類工程設計提供綜合解決方案。但是&#xff0c;正版SOLIDWORKS價格是個不可忽視的問題。那SOLIDWORKS的正版價格究竟如何呢&#xff1f;又是受什么因素影響&#xff1f; 先…

【論文閱讀|cryoET】ICE-TIDE

簡介 三維cryoET重建的保真度進一步受到采集過程中物理擾動的影響。這些擾動以各種形式表現出來&#xff0c;例如連續采集之間的樣本漂移&#xff0c;導致連續投影未對準&#xff0c;或者由于未散射的電子而導致二維投影中的局部變形。 傳統的冷凍電子斷層掃描工作流程需要對…

單片機編程的code關鍵字的詮釋

在單片機編程中&#xff0c;code 是一個關鍵字&#xff0c;用于指示編譯器將變量存儲在程序存儲器中&#xff0c;而不是在數據存儲器中。通常情況下&#xff0c;程序存儲器的速度比數據存儲器的速度更快&#xff0c;而且程序存儲器的容量較小&#xff0c;適合存儲常量數據和程序…

mybatis加密數據庫信息

1.配置MyBatisConfig.xml <environments default"development"><!-- 默認--><environment id"development"><transactionManager type"JDBC"/><dataSource type"POOLED"><property name&quo…

朗讀亭主要作用有哪些?

朗讀亭的主要作用有以下幾個方面&#xff1a; 1. 提供朗讀服務&#xff1a;朗讀亭是一個專門的場所&#xff0c;提供給人們朗讀的環境和場地。人們可以在朗讀亭中選擇自己喜歡的書籍或文章&#xff0c;并通過朗讀將其表達出來。這樣可以幫助人們提高朗讀能力&#xff0c;增強自…

2024 angstromCTF re 部分wp

Guess the Flag 附件拖入ida 比較簡單&#xff0c;就一個異或 switcher 附件拖入ida 明文flag Polyomino 附件拖入ida 需要輸入九個數&#xff0c;然后進入處理和判斷&#xff0c;如果滿足條件則進入輸出flag部分&#xff0c;flag和輸入有關&#xff0c;所以要理解需要滿足什么…

【408真題】2009-27

“接”是針對題目進行必要的分析&#xff0c;比較簡略&#xff1b; “化”是對題目中所涉及到的知識點進行詳細解釋&#xff1b; “發”是對此題型的解題套路總結&#xff0c;并結合歷年真題或者典型例題進行運用。 涉及到的知識全部來源于王道各科教材&#xff08;2025版&…