排序-選擇排序與堆排序

文章目錄

    • 一、選擇排序
    • 二、堆排序
    • 三、時間復雜度
    • 四、穩定性


一、選擇排序

思想:
將數組第一個元素作為min,然后進行遍歷與其他元素對比,找到比min小的數就進行交換,直到最后一個元素就停止,然后再將第二個元素min,再遍歷,以此下去直到最后一個數據
流程圖:
在這里插入圖片描述
代碼實現:

//交換
void Swap(int* a,int* b) {int t = *a;*a = *b;*b = t;
}
//打印
void Print(int* arr, int n) {for (int i = 0;i < n; i++)printf("%d ", arr[i]);
}
//直接選擇排序
void SelectSort(int* arr, int size) {for (int i = 0; i < size; i++){int min = i;//從第一個開始//每次從i+1的位置開始就不會影響到前面的了for (int j = i+1; j < size; j++) {//比較if (arr[min] > arr[j])min =j;//記錄下標}Swap(&arr[i], &arr[min]);//交換}}
int main() {int arr[] = { 43152};
SelectSort(arr, sizeof(arr) / sizeof(arr[0]));
Print(arr, sizeof(arr) / sizeof(arr[0]));return 0;
}

運行結果:
在這里插入圖片描述
選擇排序優化:
我們可以設置一個min和一個max,將小的放到左邊,大的放到右邊,我們再設置兩個控制左右兩邊下標的變量p,q,當它們相遇時就結束。
流程圖:
在這里插入圖片描述
特殊情況:max的位置等于p時,我們先交換arr[p]和arr[min],但是max指向p這個位置,但是p這位置的值已經改變了,這時我們就要進行糾正,將max=min,這樣才能成功找到原來在p位置的值
如:
在這里插入圖片描述
代碼實現:

//交換
void Swap(int* a,int* b) {int t = *a;*a = *b;*b = t;
}
//打印
void Print(int* arr, int n) {for (int i = 0;i < n; i++)printf("%d ", arr[i]);
}
//優化選擇排序void SelectSort1(int* arr, int size) {int p = 0, q = size-1;//p指向數組開頭,q指向數組最后一個位置while (p < q) {//當錯過或者相遇就結束int min = p, max = p;//迭代位置for (int i = p; i <= q; i++){if (arr[min] > arr[i])//找到最小值min = i;if (arr[max] < arr[i])//找到最大值max = i;}Swap(&arr[min], &arr[p]);//交換if (max == p)//5 2 3 4 1//判斷是否要糾正max = min;Swap(&arr[max], &arr[q]);//交換p++, q--;}
}
int main() {int arr[] = { 4,3,1,5,2 };SelectSort1(arr, sizeof(arr) / sizeof(arr[0]));Print(arr, sizeof(arr) / sizeof(arr[0]));return 0;
}

運行結果:
在這里插入圖片描述

二、堆排序

堆:

結構性:用數組表示的完全二叉樹;
有序性:任一結點的關鍵字是其子樹所有結點的最大值(或最小值)
“最大堆(MaxHeap)”,也稱“大頂堆”,即最大值所有父親大于等于孩子
“最小堆(MinHeap)”,也稱“小頂堆”,即最小值所有父親小于等于孩子

小堆:堆頂數據是最小的,并且所有節點都小于左右子樹
在這里插入圖片描述

大堆:堆頂數據是最大的 ,并且所有節點都大于左右子樹
在這里插入圖片描述
用堆來實現排序:
(1)使用向下調整算法:
前提:左右子樹必須是小堆或者大堆
作用:建堆
如:
左右子樹對比選擇,再與根比較
在這里插入圖片描述
(2)建堆
當我們要實現升序時,通過向下調整法要建大堆
建的過程:因為使完全二叉樹,我們可以從最后非葉點節點開始建,直到沒有節點就結束。
如:
建大堆
在這里插入圖片描述
找左右子樹位置:

樹的左子樹的下標等于根的下標*2+1,的下標等于根的下標 *2+2

建完后,我們可以將最后一個元素和第一個元素交換,然后再做向下調整即可不用重新建堆了,再讓第一個元素和倒數第二個元素交換,以此類推…
為什么不建小堆呢?如果建小堆的話,用第一個根(最小值)就是數組的第一個元素了,我們不能動它,那么再讓數組的第二元素重新做根,但是這樣的話順序就會被打破,又要重新建堆了,那樣時間復雜度會提高(如何實現降序的話可以建小堆)

代碼實現:

//交換
void Swap(int* a,int* b) {int t = *a;*a = *b;*b = t;
}
//打印
void Print(int* arr, int n) {for (int i = 0;i < n; i++)printf("%d ", arr[i]);
}
//向下調整  大堆
void AdjustDwon(int *arr,int p,int size) {int q = p;//節點位置int z = q * 2 + 1;//節點左子樹,z+1就是右子樹的位置了while (z<size) {//當z大于數組長度時就說明該節點不存在左右子樹//判斷左右子樹大小,后面是判斷是否有右子樹if (arr[z] <arr[z + 1]&&z+1<size)z += 1;if (arr[z] > arr[q]) {//判斷是否比根大Swap(&arr[z], &arr[q]);q = z;z = q * 2 + 1;//迭代}elsebreak;}
}
void  HeapSort(int* arr,  int size) {//建堆,size-1-1就是除2(求子樹公式反過來用,最后減一是因為我們求的是下標)for (int i = (size - 1 - 1) / 2; i >= 0; i--) {AdjustDwon(arr, i, size);}int ned = size - 1;
//最后一個下標位置開始,和下標為0的元素交換,一直交換下去,并且交換一次就調整一次//當ned==1就證明排好了while (ned>0) {Swap(&arr[0], &arr[ned]);AdjustDwon(arr, 0, ned);//重新調整ned--;}
}int main() {int arr[] = { 4,3,1,5,2 };HeapSort(arr, sizeof(arr)/sizeof(arr[0]));Print(arr, sizeof(arr) / sizeof(arr[0]));
return 0}

運行結果:
在這里插入圖片描述

三、時間復雜度

選擇排序:
n-1 ,n-2…2,1
是一個等差數列求前n-1項和,粗略來算就是n^2
所以時間復雜度為O(n^2)

堆排序:
建堆:O(n)
在這里插入圖片描述
向下調整的時間復雜度為:
假設樹高為 h,樹的結點為n,因為n=2^h-1,那么h=log(n-1)(以2為底)
所以為O(logn-1)
我們還要進行n次這個向下調整(當然在進行的過程中n是會變化的)
那么總的次數n+nlogn
所以時間復雜度為O(n
logn)

四、穩定性

穩定性:

假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,r[i]=r[4],且r[1]在r[4]之前,而在排序后的序列中,r[1]仍在r[4]之前,則稱這種排序算法是穩定的;否則稱為不穩定的。

選擇排序:不穩定
如:
在這里插入圖片描述
堆排序:不穩定
在這里插入圖片描述
第一個9直接到最后了

以上就是我的分享了,如果有什么錯誤,歡迎在評論區留言。
最后,謝謝大家的觀看!

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

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

相關文章

【單調棧】【二分查找】LeetCode: 2454.下一個更大元素 IV

作者推薦 【動態規劃】【廣度優先】LeetCode2258:逃離火災 本文涉及的基礎知識點 二分查找算法合集 單調棧 題目 給你一個下標從 0 開始的非負整數數組 nums 。對于 nums 中每一個整數&#xff0c;你必須找到對應元素的 第二大 整數。 如果 nums[j] 滿足以下條件&#xff…

音視頻技術開發周刊 | 323

每周一期&#xff0c;縱覽音視頻技術領域的干貨。 新聞投稿&#xff1a;contributelivevideostack.com。 Meta牽頭組建開源「AI復仇者聯盟」&#xff0c;AMD等盟友800億美元力戰OpenAI英偉達 超過50家科技大廠名校和機構&#xff0c;共同成立了全新的人工智能聯盟。以開源為旗號…

RocketMQ的架構是什么樣的?

RocketMQ&#xff0c;作為一款強大的分布式消息中間件&#xff0c;廣泛應用于各種大規模分布式系統中&#xff0c;為異步消息通信提供了可靠的解決方案。本文將深入探討RocketMQ的核心組件&#xff0c;包括Producer、Broker、Consumer和NameServer&#xff0c;以及它們在整個架…

高中物理電學總結之穩恒電流篇

高中物理電學總結之穩恒電流篇 電流電流的定義對電流的微觀分析 電阻歐姆定律電阻的串并聯電阻定律 電源的電動勢電源電動勢 閉合電路歐姆定律閉合電路閉合電路歐姆定律 電流做功與焦耳定律電流做功電功率焦耳定律電源效率 電表改裝 電流 電流的定義 電解質溶液中的自由電荷是…

ACwing算法備戰藍橋杯——Day30——樹狀數組

定義&#xff1a; 樹狀數組是一種數據結構&#xff0c;能將對一個區間內數據進行修改和求前綴和的這兩種操作的最壞時間復雜度降低到O(logn); 實現所需變量 變量名變量數據類型作用數組a[]int存儲一段區間數組tr[]int表示樹狀數組 主要操作 函數名函數參數組要作用lowbit()int…

Linux-RedHat系統-安裝 中間件 Tuxedo

安裝步聚 一、中間件安裝包&#xff1a; tuxedo121300_64_Linux_01_x86 Tuxedo下載地址&#xff1a; Oracle Tuxedo Downloads 二、新建用戶&#xff1a; &#xff08;創建Oracle用戶時&#xff0c;需要root權限操作&#xff09; 創建用戶&#xff1a; # useradd oracle …

es6從url中獲取想要的參數

第一種方法 很古老&#xff0c;通過 split 方法慢慢截取&#xff0c;可行是可行但是這個方法有一個弊端&#xff0c;因為 split 是分割成數組了&#xff0c;只能按照下標的位置獲取值&#xff0c;所以就是參數位置一旦發生變化&#xff0c;那么獲取到的值也就錯位了 let user…

利用python將data:image/jpg; base64,格式數據轉化下載為圖片

在做爬蟲爬取圖片時&#xff0c;發現有的圖片url是用“data:image/jpg;base64” 開頭的&#xff0c;例如下圖 部分開頭樣式如下&#xff1a; 1、data:image/jpg; base64, 2、data:image/png; base64, 3、data:image/webp;base64, 利用python進行代碼進行圖片下載&#xff0c;…

面向對象設計與分析40講(22)罪惡的單例模式?

單例模式曾經被認為是一種重要的設計模式&#xff0c;但現在已經失去了很多開發者的青睞。雖然單例模式可能仍然適用于某些場景&#xff0c;但它的使用已經不再像過去那樣普遍了。 單例模式是創建型設計模式的一種&#xff0c;它限制了一個類的實例化只能為一個實例&#xff0…

先進的Web3.0實戰熱門領域NFT項目幾個總結分享

非同質化代幣&#xff08;NFT&#xff09;的崛起為游戲開發者提供了全新的機會&#xff0c;將游戲內物品和資產轉化為真正的可擁有和交易的數字資產。本文將介紹幾個基于最先進的Web3.0技術實踐的NFT游戲項目&#xff0c;并分享一些相關代碼。 Axie Infinity&#xff08;亞龍無…

智能優化算法應用:基于貓群算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼

智能優化算法應用&#xff1a;基于貓群算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼 文章目錄 智能優化算法應用&#xff1a;基于貓群算法3D無線傳感器網絡(WSN)覆蓋優化 - 附代碼1.無線傳感網絡節點模型2.覆蓋數學模型及分析3.貓群算法4.實驗參數設定5.算法結果6.參考文獻7.MA…

C++ extern “C“ 用法

extern “C” 由于c中需要支持函數重載&#xff0c;所以c和c中對同一個函數經過編譯后生成的函數名是不相同的 extern “C” 的主要作用就是為了實現c代碼能夠調用其他 c 語言代碼。 1(不常用) //告訴編譯器 show() 函數按c語言的方式進行編譯和鏈接 extern "C" voi…

MySQL數據庫概念與實踐

MySQL數據庫概念與實踐 1. 概念 MySQL是一種常用的關系型數據庫管理系統&#xff0c;具有豐富的功能和廣泛的應用。在本篇博客中&#xff0c;我們將介紹MySQL數據庫的一些重要概念和相關知識。 存儲引擎 存儲引擎是MySQL數據庫用于存儲、更新和查詢數據的技術實現方法。MyS…

Python安裝第三方庫出錯

Python 程序包鏡像的國內源如下&#xff1a; 清華大學: https://pypi.tuna.tsinghua.edu.cn/simple/豆瓣(douban): https://pypi.douban.com/simple/阿里云: https://mirrors.aliyun.com/pypi/simple/中國科技大學: https://pypi.mirrors.ustc.edu.cn/simple/ 使用方法&#xf…

件夾和文件比較軟件VisualDiffer mac功能介紹

VisualDiffer mac是一款運行在MacOS上的文件夾和文件快速比較工具。VisualDiffer可以對不同文件夾中文件或文檔做出比較或者比較兩個文件的路徑。還可以通過UNIS diff命令快速、標準和可靠的比較出各類不同的文件夾和文件結果&#xff0c;使用不同的顏色直觀地顯示。 VisualDif…

酷滴科技出席浦發銀行第七屆國際金融科技創新大賽

12月7日&#xff0c;浦發銀行全球金融科技創新大賽在上海展開決賽。本屆大會以“科技金融&#xff0c;激發創新力量”為主題&#xff0c;聚焦金融行業數字化轉型過程中的痛點與難點&#xff0c;旨在探討新時代下金融科技的新角色、新機遇以及新挑戰。酷滴科技CEO張沈分享了酷滴…

12.11

1.q&#xff0c;w&#xff0c;e亮led1&#xff0c;2&#xff0c;3&#xff1b; a&#xff0c;s&#xff0c;d滅led1&#xff0c;2&#xff0c;3&#xff1b; main.c #include "uar1.h"#include "led.h"void delay(int ms){int i,j;for(i0;i<ms;i){for…

「CocoaPods」Podfile文件模板

前言&#xff1a;在iOS項目中&#xff0c;通常會使用到CocoaPods作為一個第三方庫的依賴管理工具&#xff0c;可以簡化對組件的依賴、更新的過程&#xff0c;本文將介紹在iOS項目中多Target企業級項目的Podfile文件編寫格式 一、podfile介紹 先簡單介紹一下podfile文件&#…

基于mdadm創建與管理軟raid

環境 VMware workstation 17pro CentOS Linux release 7.9.2009 (Core) ——內存8G&#xff0c;16core ——硬盤系統盤100G ——四塊20G硬盤 注意事項 1、在沒有操作系統的情況下&#xff0c;可以在裝系統時將磁盤做軟raid&#xff0c;然后使用軟raid作為系統盤 2、在重構時&a…

虛幻商城 道具匯總

文章目錄 載具Vehicle Variety Pack(車輛品種包)Vehicle Variety Pack Volume 2(車輛品種包第 2 卷)家具Free Furniture Pack(免費家具包)Old West - VOL 1 - Interior Furniture(舊西部 - 第1卷 - 家具包)Old West VOL.3 - Travel Supplies and Goods(舊西部 - 第3卷…