排序算法-選擇/堆排序(C語言)

1基本思想:

每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的 數據元素排完 。

2 直接選擇排序:

在元素集合 array[i]--array[n-1] 中選擇關鍵碼最大 ( ) 的數據元素。
若它不是這組元素中的最后一個 ( 第一個 ) 元素,則將它與這組元素中的最后一個(第一個)元素交換。
在剩余的 array[i]--array[n-2] array[i+1]--array[n-1] )集合中,重復上述步驟,直到集合剩余 1 個元素。

選擇排序的單趟就是找出最大的值的下標maxi和最小值的下標mini,然后將最小值放在最左邊,最大值放在最右邊。首先寫一個單趟,maxi和mini都在同一個位置(最左邊),然后寫一個for循環,下標i用來遍歷數組,i的起始位置是begin+1,結束條件是i>end,進入循環開始找最大值和最小值的下標,循環結束意味著maxi和mini已經到了相應的位置,就可以開始交換值了,交換完最小值后要注意一下,如果maxi一直是begin這個位置,那么就已經被換走了,換到了a[mini]這個位置,所以要修正一下,將maxi=mini,再交換最大值。那么單趟走完之后begin++,end--,每次進入循環maxi和mini都在begin這個位置,所以最外層套一個while循環,結束條件是begin>=end。

?

//選擇排序
void SelectSort(int* a, int n)
{int begin = 0, end = n - 1;while (begin < end){int mini = begin, maxi = begin;for (int i = begin + 1; i <= end; i++){//更新最大/小值的的下標if (a[i] > a[maxi]){maxi = i;}if (a[i] < a[mini]){mini = i;}}Swap(&a[begin], &a[mini]);if (maxi == begin){maxi = mini;}Swap(&a[end], &a[maxi]);begin++;end--;}
}
直接選擇排序的特性總結:
1. 直接選擇排序思考非常好理解,但是效率不是很好。實際中很少使用
2. 時間復雜度: O(N^2)
3. 空間復雜度: O(1)
4. 穩定性:不穩定

3 堆排序

堆排序 (Heapsort) 是指利用堆積樹(堆)這種數據結構所設計的一種排序算法,它是選擇排序的一種。它是 通過堆來進行選擇數據。需要注意的是排升序要建大堆,排降序建小堆。
堆排序在前面的一篇文章中有詳細介紹:
http://t.csdnimg.cn/S4Ysoicon-default.png?t=N7T8http://t.csdnimg.cn/S4Yso
1. 堆排序使用堆來選數,效率就高了很多。
2. 時間復雜度: O(N*logN)
3. 空間復雜度: O(1)
4. 穩定性:不穩定

今天的分享到這里就結束了,感謝大家的閱讀!

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

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

相關文章

PHP基礎 - 數組遍歷與排序

介紹 在PHP中,數組遍歷和排序是常見的操作,用于對數組中的元素進行訪問和排序 數組遍歷 1)數值數組的遍歷 使用 foreach 循環遍歷數組:foreach 循環是最常用的遍歷數組的方法,它可以遍歷索引數組和關聯數組。例如:$fruits = array("apple", "banana&q…

AG1KLPQ48 User Manual

1.&#xff09;軟件安裝&#xff1a; 解壓縮或執行安裝文件&#xff0c;安裝 Supra 軟件。執行文件為 bin 目錄中的 Supra.exe。 運行 Supra&#xff0c;選擇菜單 File -> Import license&#xff0c;選擇 license 文件并導入 License。 2.&#xff09;新建項目&#xff1a;…

Python與CAD系列高級篇(二十一)批量將橫向文本改豎向

0 簡述 本篇介紹以下功能開發:一次性選擇所有橫向文本并批量修改為豎向。 1 需求 需求: ① 用戶在cad中交互式選擇所有需要修改方向的文本。 ② 將所有文本方向由橫向改為豎向。 2 代碼實現 代碼實現: import win32com.client as win32 import pythoncomdef vtpnt(x, y, …

Elaticsearch 學習筆記

文章目錄 Elaticsearch 學習筆記一、什么是 Elaticsearch &#xff1f;二、Elaticsearch 安裝1 es 安裝2 問題解決3 數據格式 三、索引操作1 PUT 請求&#xff1a;在postman中&#xff0c;向 ES 服務器發 PUT 請求&#xff08;PUT請求相當于創建的意思&#xff09;2 GET 請求&a…

Base64編碼解碼

一、Base64編碼技術簡介 Base64編碼是一種廣泛應用于網絡傳輸和數據存儲的編碼方式。它將原始數據轉換為可打印的字符形式&#xff0c;以便于傳輸和存儲。Base64編碼后的數據長度是原始數據長度的約3/4&#xff0c;具有一定的壓縮效果。 Base64編碼解碼 -- 一個覆蓋廣泛主題工…

【trino權威指南】使用trino詳解:trino client安裝、查詢sql、DBeaver連接trino、java通過JDBC連接trino

文章目錄 一. Trino CLI1. 安裝client2. 使用client執行sql 二. JDBC driver 連接Trino1. 通過DBeaver用戶界面連接2. JDBC Driver in java2.1. 環境配置2.2. 注冊和配置driver2.3. 連接參數2.4. 查詢例子 一. Trino CLI 1. 安裝client Trino CLI提供了一個基于終端的交互式s…

上海交通大學生存手冊PDF

強烈推薦所有大學生去閱讀《上海交通大學生存手冊》。雖然它可能有些冗長&#xff0c;但非常重要&#xff0c;因為它道出了大學教育的本質。 如果幾年前我能夠看到這本書&#xff0c;也許我的大學生活會有所不同。現在我將向正在上大學或者將要上大學的你推薦這本書。 無論你…

通過虛擬機安裝Open5GS 和UERANSIM記錄

目錄 wsl虛擬環境嘗試失敗 step1 安裝wsl: step2下載Ubuntu 20.04.6 LTS: step3升級wsl&#xff1a; step4生成用戶: step5 linux下安裝軟件需要的鏡像&#xff1a; step6 安裝圖形界面xfce和瀏覽器&#xff1a; step6 安裝chrome virtual box安裝ubuntu step7&#xf…

AWS攻略——Peering連接VPC

文章目錄 創建IP/CIDR不覆蓋的VPC創建VPC創建子網創建密鑰對創建EC2 創建Peering接受Peering邀請修改各個VPC的路由表修改美東us-east-1 pulic subnet的路由修改悉尼ap-southeast-2路由 測試知識點 我們回顧下《AWS攻略——VPC初識》中的知識&#xff1a; 一個VPC只能設置在一…

Android引用SDK包實現高德地圖展示

一、準備工作 注冊高德地圖開放平臺 注冊過程我就不多說了&#xff0c;挺簡單的&#xff0c;需要登錄&#xff0c;然后注冊成為開發者&#xff0c;還需要支付寶認證、手機號碼驗證、郵箱驗證挺多的&#xff0c;但是速度很快。基本上隨時驗證隨時注冊成功。新建應用新建…

在C語言中,%d,%c,%f都是什么意思

printf函數調用的一般形式 printf函數是一個標準庫函數&#xff0c;它的函數原型在頭文件“stdio.h”中。但作為一個特例&#xff0c;不要求在使用 printf 函數之前必須包含stdio.h文件。printf函數調用的一般形式為&#xff1a; printf(“格式控制字符串”&#xff0c;輸出表列…

重點車輛安全監測預警技術方案

目錄 1.系統架構 2.詳細設計 2.1駕駛員信息監控 2.1.1駕駛員基本信息管理 2.1.2人車匹配信息 2.1.3駕駛員在線狀態管理 2.2車輛狀態信息管理 2.2.1車輛信息管理 2.1.2車輛在路狀態管理 2.3重點車輛安全監測預警系統云平臺 2.3.1云平臺需求分析 2.3.2 設計思想 2.4.…

urllib 異常、cookie、handler及代理(四)

目錄 一、urllib異常 二、urllib cookie登錄 三、urllib handler 處理器的基本使用 四、urllib 代理和代理池 參考 一、urllib異常 URLError/HTTPError 簡介&#xff1a; 1.HTTPError類是URLError類的子類 2.導入的包urllib.error.HTTPError urllib.error.URLError 3.h…

18 Java與redis集群的通信

1、引入依賴 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.6.3</version></dependency>2、配置 # Redis集群服務器地址 redis.nodesaliyun:6900,aliyun:6901,aliyun:6902,aliyun…

20道計算機網絡面試題

網絡分層 1、說說OSI 七層、TCP/IP 四層的關系和區別&#xff1f; OSI 七層從下往上依次是&#xff1a;物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層。一張圖給你整明白&#xff1a; TCP/IP 四層從下往上依次是&#xff1a;網絡接口層、網絡層、傳輸層、應用…

MATLAB - 評估擬合優度、評價擬合效果

系列文章目錄 文章目錄 系列文章目錄前言一、如何評估擬合優度二、擬合優度統計2.1 SSE - 誤差引起的平方和2.2 R 平方2.3 自由度調整 R 平方2.4 均方根誤差 三、MATLAB - 評估曲線擬合度3.1 加載數據并擬合多項式曲線3.2 繪制擬合方程、數據、殘差和預測范圍圖3.3 評估指定點3…

java--Object

1.Object類的作用 Object類是java中所有類的祖宗類&#xff0c;因此&#xff0c;java中所有類的對象都可以直接使用Object類中提供一些方法 2.Object類的常見方法 ①toString存在的意義&#xff1a;toString()方法存在的意義就是為了被子類重寫&#xff0c;以便返回對象具體的…

【Python實戰系列】一文徹底搞懂異常捕獲及處理(理論+源碼)

一、問題 異常處理是Python中一種用于處理程序運行時錯誤的機制。在編寫代碼時&#xff0c;可能會出現各種不可預測的情況&#xff0c;例如除零錯誤、文件不存在、網絡連接問題等等。為了確保程序能夠在出現錯誤時正常運行&#xff0c;您可以使用異常處理機制來捕獲和處理這些異…

K8S學習指南(5)-k8s核心對象namespace

文章目錄 前言什么是Namespace&#xff1f;Namespace的類型創建Namespace使用kubectl創建Namespace示例 切換Namespace查看Namespace在Namespace中部署應用程序使用Namespace進行資源隔離Namespace的權限控制刪除Namespace總結 前言 Kubernetes&#xff08;簡稱K8s&#xff09…

前端知識(十六)——js獲取時間戳方法

1、獲取當前時間 let date new Date() 2、將字符串或者對象直接轉化成時間戳 方法&#xff1a;Date.parse() 注意&#xff1a;不推薦這種方法&#xff0c;毫秒級別的數值被轉化為000 3、通過valueOf()函數返回指定的原始值獲得精準的時間戳值 方法&#xff1a;valueOf()…