【排序】選擇排序(含優化版)

本章我們繼續講排序算法,這里我們將學習選擇排序,也是一個很普遍很常見的排序算法,邏輯和代碼都比較簡單,比較容易掌握,我們直接走起

選擇排序

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

我們這里以排升序為例

選擇排序與冒泡排序一樣,也分為內層循環和外層循環,內層循環是找出最小的元素放到未排序數組的第一位,外層循環按照內層邏輯,一步一步的將元素由小到大依次放到數組內,完成排序

單趟邏輯:單趟排序就是從記錄本次循環的第一個元素,依次向后比較,若后面的元素大于記錄的元素,那么就將記錄的元素換為更小的元素,并記錄此時記錄元素的下標方便在出循環后進行交換,找到數組末尾,本次單趟循環結束,此時記錄的元素就是最小元素,那么我們就進行交換

整體邏輯:沿用單趟邏輯,多次進行排序,若有n個數據,那么就需要外層循環n-1次,將數據全部排好。

邏輯圖

代碼實現

void SelectSort(int* a, int n)
{for (int i = 0; i < n - 1; i++){int tmp = a[i];int k = i;for (int j = i + 1; j < n; j++){if (a[j] < tmp){tmp = a[j];k = j;}}Swap(&a[i], &a[k]);}
}

優化

思路:上面的選擇排序是基本的選擇排序,我們可以發現,他每次循環都需要遍歷未排序的數組去尋找最小的元素,那么我們換一種思路,如果我們在遍歷未排序的數組時,同時找到最大的元素和最小的元素,是不是就減少了一半的循環量,思路有了,我們就直接開始實現

總體的思路還是和上面大差不差,但是這次我們需要多建一個變量end,來記錄數組末尾的位置

然后依次進行遍歷,之前我們用tmp記錄最小的數,這里就需要用兩個變量max 和 min來分別記錄最大值和最小值,為了方便我們直接記錄下標,這樣就不用新建變量來記錄下標了,而且還可以直接進行比較

流程圖

?優化代碼(有瑕疵)
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 + 1; i <= end; i++){if (a[i] > a[max]){max = i;}if (a[i] < a[min]){min = i;}}Swap(&a[begin], &a[min]);Swap(&a[end], &a[max]);begin++;end--;}
}

看了上面的分析和代碼的實現,也許你會認為,這樣就完成選擇排序的優化,但是事實真的如此嗎,先說結論,這個排序邏輯確實是這樣的,代碼基本也是對的,可以完成大多數的排序,但是有個別情況,是無法進行正確排序的,因此上面實現的是有瑕疵的

我們來分析一下,當第一輪排序時,我們上面的代碼會記錄

max為0,min為 1 ,begin為0,end為7

進行交換的時候,先交換begin和min

結果為 1? ?9? 2? ?5? ?7? 4? ?6? 3

再交換max和end的時候

結果為 3? ? 9? ? 2? ? 5? ?7? ? 4? ?6? ?1

很顯然,已經出錯了,max在和end進行交換的時候,max已經變換了位置,因此我們找到了問題,找到了問題之后,我們就需要解決問題

我們只需要加一個判斷條件,當最大值為begin時,第一步begin和min交換就會把max的值交換走,這時我們需要進行判斷,如果begin==max,那么就將max的值賦為min,即此時最大值被交換到的位置,再進行第二步交換即可。

優化代碼最終實現
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 (begin == maxi)maxi = mini;Swap(&a[end], &a[maxi]);++begin;--end;}
}

?總結(冒泡排序和選擇排序的區別)

冒泡排序的時間復雜度為O(n^2),其中n是要排序的元素數量。這是因為冒泡排序需要進行多次遍歷,每次遍歷都需要比較和交換元素。因此,對于大規模數據的排序,冒泡排序可能不是最有效的選擇。
選擇排序的時間復雜度也是O(n^2),但它的性能通常優于冒泡排序。因為選擇排序只需要進行一次遍歷,并且只需要進行一次比較和交換操作。因此,在處理大規模數據時,選擇排序通常更為高效。

但如果遇到已經排好序的數據,冒泡排序只需要循環一次就能發現,并終止,但選擇排序卻需要繼續遍歷數組,在這一點上選擇排序的效率是不如冒泡排序的。

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

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

相關文章

Layui2.5.6樹形表格TreeTable使用

1、問題概述? Layui2.5.6的樹形表格-TreeTable終于用明白了,步驟詳細,提供源碼下載。 如果你使用的是Layui2.8+版本,那么點個贊,趕緊去官網看吧,官網更行了。 更新地址:樹表組件 treeTable - Layui 文檔 最近在項目中需要使用到樹形表格,用來顯示菜單的層級關系,當…

(delphi11最新學習資料) Object Pascal 學習筆記---第14章泛型第1節(泛型鍵值對)

14.1.1 內聯變量和泛型類型推斷 ? 在聲明泛型變量時&#xff0c;聲明可能相當長。在創建該類型的對象時&#xff0c;必須重復相同的聲明。除非您利用內聯變量聲明及其變量類型推斷的能力。因此&#xff0c;上面最后一個代碼片段可以寫成&#xff1a; beginvar Kvi : TKeyVal…

Leetcode 第 398 場周賽題解

Leetcode 第 398 場周賽題解 Leetcode 第 398 場周賽題解題目1&#xff1a;3151. 特殊數組 I思路代碼復雜度分析 題目2&#xff1a;3152. 特殊數組 II思路代碼復雜度分析 題目3&#xff1a;3153. 所有數對中數位不同之和思路代碼復雜度分析 題目4&#xff1a;3154. 到達第 K 級…

辯證 邏輯學 | 洞察 事物矛盾及變化規律 在形式邏輯基礎上 學會辯證思維(40節課)

課程下載&#xff1a;辯證邏輯學洞察事物矛盾及變化規律在形式邏輯基礎上學會辯證思維&#xff08;40節課&#xff09;-課程網盤鏈接提取碼下載.txt資源-CSDN文庫 更多資源下載&#xff1a;關注我。 在形式邏輯的基礎上&#xff0c;學會 辯證思維 敏銳 洞察事物發展變化的規…

Linux命令篇(一):文件管理部分

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;歡迎各位來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里不僅可以有所收獲&#xff0c;同時也能感受到一份輕松歡樂的氛圍&#xff0c;祝你生活愉快&#xff01; 文章目錄 1、cat命令常用參…

童趣盎然,米香四溢 —— 蒙自源六一兒童節特別獻禮

充滿歡聲笑語的六一兒童節馬上就要來了&#xff0c;在這個充滿童真和喜悅的時刻&#xff0c;蒙自源米線品牌以一顆童心&#xff0c;為所有大朋友和小朋友準備了一份特別的禮物。 從5月25日開始&#xff0c;蒙自源誠摯邀請您和孩子們一同前往蒙自源旗下各大門店&#xff0c;品嘗…

【MySQL數據庫】MySQL 高可用搭建方案——MHA實戰

MHA&#xff08;Master High Availability&#xff09; MHA實戰 MHA&#xff08;Master High Availability&#xff09; 一、MHA簡介二、MHA搭建準備要求&#xff1a;mha集群搭建&#xff0c;4臺服務器&#xff0c;1主2從&#xff0c;1臺mha2.1實驗思路2.2實驗準備 三、搭建MyS…

每日一題31:數據統計之即時配送食物

一、每日一題 配送表: Delivery -------------------------------------- | Column Name | Type | -------------------------------------- | delivery_id | int | | customer_id | int | | order_date …

HTML5常用標簽表格

04-08、表格標簽table 概述 表格&#xff1a;是一種行和列組合而成的單元格。一般應用于后臺網頁設計管理數據使用。 表格的架構部分&#xff1a; tabletable head 表格頭 theadtable body - 表格體 tbodytable foot -表格的頁腳 tfoot 表格的基本組成部分&#xff1a; t…

Bluetooth Profiles,藍牙配置文件對應設備

下面的常量是藍牙各種配置文件的標識符。 每個常量代表一個特定的藍牙配置文件&#xff0c;這些配置文件定義了藍牙設備之間通信的特定方式。以下是每個常量的解釋&#xff1a; HEADSET (1): 代表耳機和免提配置文件&#xff0c;通常用于藍牙耳機或車載免提系統。A2DP (2): 代…

opencv-python(三)

馬賽克 face img[162:428,297:527] # 人臉坐標區域face face[::10,::10] # 每10個中取出一個像素&#xff0c;馬賽克face np.repeat(face, 10, axis0) # 行方向重復10次face np.repeat(face, 10, axis1) # 列方向重復10次img[162:428,297:527] face[:266,:230] # 填充&a…

計算機科學與技術和軟件工程專業有什么區別?應該怎么選?

計算機科學與技術和軟件工程都是就業前景較好的計算機類專業&#xff0c;二者密切相關但側重點不同&#xff0c;同學們應該如何選擇呢&#xff1f; 一、學習內容 1.學科定位 ● 計算機科學與技術 側重于計算機科學的理論研究和基礎技術&#xff0c;包括算法、數據結構、人工…

lnmp平臺部署web應用,安裝Discuz社區平臺詳細文章——更新中

Nginx網站service 詳細相關介紹-特點-http狀態碼-配置文件、將nginx添加永久環境變量 訪問網站404是什么&#xff1f;_nginx 穩定版-CSDN博客文章瀏覽閱讀1.2k次&#xff0c;點贊33次&#xff0c;收藏24次。開源Web服務器軟件。_nginx 穩定版https://blog.csdn.net/2301_771619…

數據結構--數組(詳細分析)

目錄 &#x1f349;引言 &#x1f349;數組 &#x1f348;數組的特性 &#x1f348;數組的優缺點 &#x1f34d;優點&#xff1a; &#x1f34d;缺點&#xff1a; &#x1f348;數組的聲明與初始化 &#x1f348;數組的常見操作 &#x1f34d; 插入操作 &#x1f34d;…

Touch Camera PRO 2024 Easy Mobile Desktop Camera Controller(觸控相機專業版)

一個真正易于使用的移動+臺式攝像機控制器,具有視角切換功能! Touch Camera PRO 是一款非常易于使用的移動+桌面相機控制器,具有透視切換功能!它在 Home Designer、Runtime Level Editor 和 Floor Map Designer 等其他插件中使用! 在桌面和移動設備上工作! 一個干…

WIireShark使用教程

文章目錄 目錄 文章目錄 一.入門抓包示例 一.入門抓包示例 先介紹一下如何使用wireshark抓取相應網卡的流量&#xff0c;讓讀者可以先上手操作感受一下抓包的具體過程。 1.打開wireshark的主界面如下 2.選擇需要抓包的網卡&#xff0c;鼠標左鍵雙擊&#xff0c;即可抓取該網…

Mysql常見問題總結

1、MySQL初始化報錯 mysqld --initialize --usermysql --console 2024-06-02T15:52:22.645557Z 0 [System] [MY-013169] [Server] D:\installSoft\mysql-8.0.21-winx64\bin\mysqld.exe (mysqld 8.0.21) initializing of server in progress as process 8980 2024-06-02T15:52:2…

02-2.3.2_1 單鏈表的插入和刪除

喜歡《數據結構》部分筆記的小伙伴可以訂閱專欄&#xff0c;今后還會不斷更新。 此外&#xff0c;《程序員必備技能》專欄和《程序員必備工具》專欄&#xff08;該專欄暫未開設&#xff09;日后會逐步更新&#xff0c; 插入 按位序插入 &#xff08;1&#xff09;帶頭結點 L…

量子加速超級計算簡介

本文轉載自&#xff1a;量子加速超級計算簡介(2024年 3月 13日) By Mark Wolf https://developer.nvidia.cn/zh-cn/blog/an-introduction-to-quantum-accelerated-supercomputing/ 文章目錄 一、概述二、量子計算機的構建塊&#xff1a;QPU 和量子位三、量子計算硬件和算法四、…

代碼隨想錄算法訓練營第三十七 | ● 738.單調遞增的數字 ● 968.監控二叉樹

738.單調遞增的數字 講解鏈接&#xff1a;https://programmercarl.com/0738.%E5%8D%95%E8%B0%83%E9%80%92%E5%A2%9E%E7%9A%84%E6%95%B0%E5%AD%97.html class Solution { public:int monotoneIncreasingDigits(int n) {//整數轉字符串&#xff0c;變為字符串訪問比諸位取出數字要…