網站首頁 編程語言 正文
進入正式內容之前,我們先了解下初階常見的排序分類?:我們今天講前四個!
1、直接插入排序
基本思想:當插入第i(i>=1)個元素時,前面的array[0],array[1],…,array[i-1]已經排好序,此時用array[i]的排 序碼與array[i-1],array[i-2],…的排序碼順序進行比較,找到插入位置即將array[i]插入,原來位置上的元素順序后移!
直接插入排序的特性總結:
1. 元素集合越接近有序,直接插入排序算法的時間效率越高
2. 時間復雜度:O(N^2) 、空間復雜度:O(1)
3. 穩定性:穩定
void InsertSort(int* a, int n) { //直接插入排序 ———— 升序 for (int i = 0; i < n - 1; ++i) { int end = i; int tmp = a[end + 1]; while (end >= 0) { if (a[i] > tmp) //如果比tmp大的話就往后移 { a[end + 1] = a[end]; --end; } else //如果tmp比當前元素大的話就不需要交換位置了,直接跳出循環! { break; } } a[end + 1] = tmp; // 最后把tmp放到比他小的元素后面! } }
2、希爾排序(縮小增量排序)
基本思想:先選定一個整數,把待排序文件中所有記錄分成個組,所有距離為gap的記錄分在同一組內,并對每一組內的記錄進行排序。然后重復分組和排序的工作。當到達gap=1時,所有記錄在統一組內排好序。
希爾排序的特性總結:
1. 希爾排序是對直接插入排序的優化。
2. 當gap > 1時都是預排序,目的是讓數組更接近于有序。當gap == 1時,數組已經接近有序的 了,這樣就會很快。這樣整體而言,可以達到優化的效果。
3. 希爾排序的時間復雜度不好計算,需要進行推導,推導出來平均時間復雜度: O(N^1.3— N^2)
4. 穩定性:不穩定
void ShellSort(int* a, int n) { //希爾排序————升序 int gap = n; while (gap > 1) { gap = gap / 2; for (int i = 0; i < n - gap; ++i) { int end = i; int tmp = a[end + gap]; while (end >= 0) { if (a[end] > tmp) { a[end + gap] = a[end]; end = end - gap; } else { break; } a[end + gap] = tmp; } } } }
3、直接選擇排序
基本思想:
在元素集合array[i]--array[n-1]中選擇關鍵碼最大(小)的數據元素 若它不是這組元素中的最后一個(第一個)元素,則將它與這組元素中的最后一個(第一個)元素交換 在剩余的array[i]--array[n-2](array[i+1]--array[n-1])集合中,重復上述步驟,直到集合剩余1個元素。
直接選擇排序的特性總結:(因為特別簡單就不畫圖了直接上代碼)
1. 直接選擇排序思考非常好理解,但是效率不是很好。實際中很少使用
2. 時間復雜度:O(N^2) 、空間復雜度:O(1)
3. 穩定性:不穩定
?這里我們用一個優化版本,每次確定兩個數的最終位置:
void Swap(int* p1, int* p2) { int tmp = *p1; *p1 = *p2; *p2 = tmp; } void SelectSort(int* a, int n) { int begin = 0; int end = n - 1; while (begin < end) { int min = begin; int max = begin; for (int i = begin; i <= end; ++i) { if (a[i] < a[min]) { min = i; } if (a[i] > a[max]) { max = i; } } Swap(&a[min], &a[begin]); if (max == begin) //如果max等于begin的話就證明最大值是begin的位置 //需要修正max的位置 { max = min; } Swap(&a[max], &a[end]); ++begin; --end; } }
4、堆排序
堆排序(Heapsort)是指利用堆積樹(堆)這種數據結構所設計的一種排序算法,它是選擇排序的 一種。它是通過堆來進行選擇數據。需要注意的是排升序要建大堆,排降序建小堆。?
堆排序的特性總結:
1. 堆排序使用堆來選數,效率就高了很多。
2. 時間復雜度:O(N*logN) 、空間復雜度:O(1)
3. 穩定性:不穩定
void AdjustDown(int* a, int n, int root) { int parent = root; int child = parent * 2 + 1; while (child < n) { if (child + 1 < n && a[child] < a[child + 1]) { child = child + 1; } if (a[child] > a[parent]) { Swap(&a[child], &a[parent]); parent = child; child = parent * 2 + 1; } else { break; } } } void HeapSort(int* a, int n) { for (int i = (n - 1 - 1) / 2; i >= 0; --i) { AdjustDown(a, n, i); } int end = n - 1; while (end > 0) { Swap(&a[0], &a[end]); AdjustDown(a, end, 0); --end; } }
建議小伙伴們看完之后一定要自己嘗試畫圖,以及代碼練習!如果前面C語言代碼量不多的話,寫起來也會很吃力的!里面也涉及到了二叉樹的相關知識,如果有疑問可以直接聯系我!?
小伙伴們,咱們軟件這一行,實力才是硬道理,愛打籃球的程序猿想送你們一句話:雖然過去不能改變,但未來可以!加油,趁現在!
gitee(碼云):Mercury. (zzwlwp) - Gitee.com? ? ? ?
原文鏈接:https://blog.csdn.net/m0_61784621/article/details/123708103
相關推薦
- 2022-05-07 LINQ教程之LINQ操作語法_實用技巧
- 2023-03-04 Google大佬都用的廣播goAsync源碼分析_Android
- 2022-12-30 antd之RangePicker設置默認值方式_React
- 2022-03-19 C語言數據結構之隊列算法詳解_C 語言
- 2022-06-25 JQuery選擇器用法詳解_jquery
- 2022-06-11 python?針對在子文件夾中的md文檔實現批量md轉word_python
- 2022-06-08 兩步配置解決 IDEA新項目maven依賴問題
- 2022-10-14 nginx 反向代理以及 location /admin/
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支