八大排序之選擇排序

本篇文章將帶你詳細了解八大基本排序中的選擇排序


目錄

(一)選擇排序的時間復雜度和空間復雜度及穩定性分析

(二)代碼實現

(三)輸出結果


選擇排序的基本原理是:每次從待排序的數組中找出最大值和最小值。具體流程是:每次找出最大值和最小值之后,把最大值和數組的右邊界互換,把最小值和數組的左邊界互換。這樣,第一次找出的最大值和最小值就被放好了。然后由于數組的左右邊界已經在正確的位置了,所以我們把左邊界加1,右邊界-1.這樣新的數組仍然是待排序的數組,然后由此類推,直到左邊界大于右邊界為止。這里附上GIF動圖。

(一)選擇排序的時間復雜度和空間復雜度及穩定性分析

我們以每次選出最大值或最小值的簡單選擇排序來分析。

  • 當數組有序時,選擇排序仍要遍歷整個數組,然后從中選出最值放在邊界。這里的時間復雜度是O(N)。重復上述過程,整個排序的時間復雜度就是O(N方)了。
  • 同理,當數組無序時,也同樣是當數組有序時的處理,所以時間復雜度也是O(N方)

至于空間復雜度

  • 整個排序沒有多余的空間產生,所以空間復雜度是O(1)

穩定性分析

  • 每次選出的最大值和最小值,并不能保持在相同大小的相對位置。所以選擇排序是不穩定的排序

(二)代碼實現

//選擇排序的實現。我們每次選出最大值或最小值,分別與數組的兩個邊界互換。void Select(int* arr, int n)
{//形參列表的arr是待排序數組,n是數組的大小//開始的邊界就是數組的左右邊界int begin = 0;int end = n - 1;//n-1是數組最后一個元素的下標while (begin < end){//進入循環//找到最大值和最小值int maxi = begin;int mini = begin;for (int i = begin + 1; i <= end; i++){if (arr[i] > arr[maxi]){maxi = i;  }if (arr[i] < arr[mini]){mini = i;}}//找到最大值和最小值后,與數組邊界交換//這里注意的是當待排序數組只有兩個時,并且最大值是下標是前一個,最小值的下標是后一個時//交換了2次就等同于沒有變。//所以我們得防止這樣的情況if (maxi == begin){maxi = mini;}//我們寫一個下標交換函數    Swap(&arr[begin]. &arr[mini]);Swap(&arr[end], &arr[maxi]);begin++;end--;}   
}int main()
{//產生無序數組int arr[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};int n = sizeof(arr) / sizeof(arr[0]);//n是數組的大小Select(arr, n);}

(三)輸出結果

?

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

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

相關文章

【算法學習】哈希表篇:哈希表的使用場景和使用方法

算法學習&#xff1a; https://blog.csdn.net/2301_80220607/category_12922080.html?spm1001.2014.3001.5482 前言&#xff1a; 在之前學習數據結構時我們就學習了哈希表的使用方法&#xff0c;這里我們主要是針對哈希表的做題方法進行講解&#xff0c;都是leetcode上的經典…

Java 中如何實現自定義類加載器,應用場景是什么?

在 Java 中&#xff0c;可以通過繼承 java.lang.ClassLoader 類來實現自定義類加載器。自定義類加載器可以控制類的加載方式&#xff0c;實現一些特殊的應用場景。 實現自定義類加載器的步驟&#xff1a; 繼承 java.lang.ClassLoader 類。 重寫 findClass(String name) 方法 …

信創開發中跨平臺開發框架的選擇與實踐指南

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、CSDN平臺優質創作者&#xff0c;高級開發工程師&#xff0c;數學專業&#xff0c;10年以上C/C, C#, Java等多種編程語言開發經驗&#xff0c;擁有高級工程師證書&#xff1b;擅長C/C、C#等開發語言&#xff0c;熟悉Java常用開…

WebRTC 服務器之Janus架構分析

1. Webrtc三種類型通信架構 1.1 1 對 1 通信 1 對 1 通信模型設計的主要?標是盡量讓兩個終端進?直聯&#xff0c;這樣即可以節省服務器的資源&#xff0c;?可以提? ?視頻的服務質量。WebRTC ?先嘗試兩個終端之間是否可以通過 P2P 直接進?通信&#xff0c;如果?法直接…

數字化轉型進階:26頁華為數字化轉型實踐分享【附全文閱讀】

本文分享了華為數字化轉型的實踐經驗和體會。華為通過數字化變革,致力于在客戶服務、供應鏈、產品管理等方面提高效率,并把數字世界帶入每個組織,構建萬物互聯的智能世界。華為的數字化轉型愿景是成為行業標桿,通過推進數字化戰略、構建面向業務數字化轉型的IT組織陣型、堅…

Hal庫下備份寄存器

首先要確保有外部電源給VBAT供電 生成后應該會有這兩個文件&#xff08;不知道為什么生成了好幾次都沒有&#xff0c;復制工程在試一次就有了&#xff09; 可以看到stm32f407有20個備份寄存器 讀寫函數 void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t Backup…

使用 Vue3 + Webpack 和 Vue3 + Vite 實現微前端架構(基于 Qiankun)

在現代前端開發中&#xff0c;微前端架構逐漸成為一種流行的解決方案&#xff0c;尤其是在大型項目中。通過微前端&#xff0c;我們可以將一個復雜的單體應用拆分為多個獨立的小型應用&#xff0c;每個子應用可以獨立開發、部署和運行&#xff0c;同時共享主應用的基礎設施。本…

【c++】【STL】list詳解

目錄 list的作用list的接口構造函數賦值運算符重載迭代器相關sizeemptyfrontbackassignpush_frontpop_frontpush_backpop_backinserteraseswapresizeclearspliceremoveremove_ifuniquemergesortreverse關系運算符重載&#xff08;非成員函數&#xff09; list的模擬實現結點類迭…

Redis持久化:

什么是Redis持久化&#xff1a; Redis 持久化是指將 Redis 內存中的數據保存到硬盤等持久化存儲介質中&#xff0c;以便在 Redis 服務器重啟或出現故障時能夠恢復數據&#xff0c;保證數據的可靠性和持續性。Redis 提供了兩種主要的持久化方式&#xff1a;RDB&#xff08;Redi…

VBA 64位API聲明語句第009講

跟我學VBA&#xff0c;我這里專注VBA, 授人以漁。我98年開始&#xff0c;從源碼接觸VBA已經20余年了&#xff0c;隨著年齡的增長&#xff0c;越來越覺得有必要把這項技能傳遞給需要這項技術的職場人員。希望職場和數據打交道的朋友&#xff0c;都來學習VBA,利用VBA,起碼可以提高…

在pycharm profession 2020.3將.py程序使用pyinstaller打包成exe

一、安裝pyinstaller 在pycharm的項目的Terminal中運行pip3 install pyinstaller即可。 安裝后在Terminal中輸入pip3 list看一下是否成功 二、務必在在項目的Terminal中輸入命令打包&#xff0c;命令如下&#xff1a; python3 -m PyInstaller --noconsole --onefile xxx.py …

Unity SpriteRenderer(精靈渲染器)

&#x1f3c6; 個人愚見&#xff0c;沒事寫寫筆記 &#x1f3c6;《博客內容》&#xff1a;Unity3D開發內容 &#x1f3c6;&#x1f389;歡迎 &#x1f44d;點贊?評論?收藏 &#x1f50e;SpriteRenderer:精靈渲染器 &#x1f4a1;Sprite Renderer是精靈渲染器&#xff0c;所有…

2.LED燈的控制和按鍵檢測

目錄 STM32F103的GPIO口 GPIO口的作用 GPIO口的工作模式 input輸入檢測 -- 向內檢測 output控制輸出 -- 向外輸出 寄存器 寄存器地址的確定 配置GPIO口的工作模式 時鐘的開啟和關閉 軟件編程驅動 LED 燈 硬件 軟件 軟件編程驅動 KEY 按鍵 硬件 軟件 按鍵消抖 代碼 STM32F…

Flink 的狀態機制

在實時流處理領域&#xff0c;狀態管理是構建復雜業務邏輯的核心能力。Apache Flink 通過統一的狀態抽象和高效的容錯機制&#xff0c;為開發者提供了從毫秒級窗口聚合到 TB 級歷史數據關聯的全場景支持。本文將深入剖析 Flink 狀態機制的底層原理&#xff0c;結合實際案例展示…

【查看.ipynp 文件】

目錄 如何打開 .ipynb 文件&#xff1f; 如果確實是 .ipynp 文件&#xff1a; .ipynp 并不是常見的 Jupyter Notebook 文件格式。通常&#xff0c;Jupyter Notebook 文件的擴展名是 .ipynb&#xff08;即 Interactive Python Notebook&#xff09;。如果你遇到的是 .ipynb 文…

Runnable組件重試機制降低程序錯誤率

一、LangChain 重試機制深度解析 當構建生產級AI應用時&#xff0c;with_retry() 機制可有效提升系統容錯性&#xff0c;典型應用場景包括&#xff1a; API調用頻率限制時的自動恢復模型服務臨時不可用的故障轉移網絡波動導致的瞬時異常處理 參數詳解與配置策略 1. 參數配置…

k8s筆記——kubebuilder工作流程

kubebuilder工作流程 Kubebuilder 工作流程詳解 Kubebuilder 是 Kubernetes 官方推薦的 Operator 開發框架&#xff0c;用于構建基于 Custom Resource Definitions (CRD) 的控制器。以下是其核心工作流程的完整說明&#xff1a; 1. 初始化項目 # 創建項目目錄 mkdir my-opera…

Java框架“若依RuoYi”前后端分離部署

運行環境 Eclipse IDE for Enterprise Java and Web Developers 下載Eclipse解壓Eclipse到文件夾 Maven 下載Maven解壓Maven到文件夾配置環境變量MAVEN_HOME為Maven安裝位置配置環境變量path為%MAVEN_HOME%\bin Redis 下載Redis解壓Redis到文件夾配置環境變量path為Redis安裝位…

游戲引擎學習第249天:清理調試宏

歡迎大家&#xff0c;讓我們直接進入調試代碼的改進工作 接下來&#xff0c;我們來看一下上次停留的位置。如果我沒記錯的話&#xff0c;上一場直播的結尾我有提到一些我想做的事情&#xff0c;并且在代碼中留下了一個待辦事項。所以也許我們今天首先做的就是解決這個問題。但…

二極管反向恢復的定義和原理

二極管的反向恢復定義 二極管的反向恢復是指二極管從正向導通狀態切換到反向阻斷狀態時&#xff0c;電流從正向變為負向并最終回到零所需的時間。具體過程如下&#xff1a; 正向導通&#xff1a;當二極管正向偏置時&#xff0c;電流可以順利通過&#xff0c;此時二極管處于導…