數據結構與算法-選擇排序

引言

????????在計算機科學中,數據結構和算法是兩個至關重要的基石。它們共同決定了程序的效率、可讀性和可維護性。本文我們將聚焦于一種基礎而直觀的排序算法——選擇排序,并探討其內在的工作機制以及在實際應用中的優缺點。

一、什么是選擇排序?

????????選擇排序(Selection Sort)是一種簡單直觀的排序算法。它的基本思想是在未排序序列中找到最小(或最大)元素,存放到排序序列的起始位置,然后再從剩余未排序元素中繼續尋找最小(或最大)元素,然后放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。

二、選擇排序的步驟詳解

  1. 初始化:首先,在待排序的數組中選出一個基準元素,通常我們選擇第一個元素作為初始基準。

  2. 查找最小(或最大)值:遍歷從第二個元素開始到數組結尾的所有元素,找出其中的最小(或最大)值及其索引。

  3. 交換位置:將找到的最小(或最大)值與其所在位置之前的基準元素交換位置,這樣基準元素的位置就確定了,它左邊的元素都比它小(或大),右邊的則還沒有比較過。

  4. 重復過程:之后,對剩余未排序的部分進行同樣的操作,即選取剩余部分的第一個元素為新的基準,重復上述查找和交換的過程,直至整個序列有序。

三、選擇排序的時間復雜度和空間復雜度

四、選擇排序的優點與缺點

  1. 時間復雜度:由于無論哪種情況下都需要對數組進行n(n-1)/2次比較,因此選擇排序的時間復雜度為O(n2),這在處理大量數據時效率較低。

  2. 空間復雜度:選擇排序是原地排序算法,只需要常量級的額外空間,故其空間復雜度為O(1)。

優點

  • 實現簡單,邏輯清晰,易于理解。
  • 不依賴于原始數據的特性,對輸入數據的隨機性不敏感。
  • 空間效率高,只需要常量級的輔助空間。

缺點

  • 效率相對低下,尤其對于大數據集,因其線性階的比較次數導致性能瓶頸明顯。
  • 不穩定排序,即相等元素的順序可能會在排序過程中發生改變。

五、選擇排序的圖解過程

圖解小結

1. 選擇排序一共有數組大小-1次排序

2. 每一輪排序,又是一個循環,循環的規則:

2.1 先假定當前這個數是最小數

2.2 然后和后面的每一個數比較,如果發現有比當前更小的數,就重新確定最小數并記錄其下標

2.3 當遍歷到數組的最后時,就得到本輪最小數和其下標

2.4 交換

六、選擇排序的代碼實踐?

1.展示每一次選擇排序過程

        int minIndex1 = 0;int min1 = arr[0];for (int j = 0 + 1; j < arr.length; j++) {if (min1 > arr[j]) {min1 = arr[j];minIndex1 = j;}}if (minIndex1 != 0) {arr[minIndex1] = arr[0];arr[0] = min1;}System.out.println("第一輪的遍歷為");System.out.println(Arrays.toString(arr));int minIndex2 = 1;int min2 = arr[1];for (int j = 1 + 1; j < arr.length; j++) {if (min2 > arr[j]) {min2 = arr[j];minIndex2 = j;}}if (minIndex2 != 1) {arr[minIndex2] = arr[1];arr[1] = min2;}System.out.println("第二輪的遍歷為");System.out.println(Arrays.toString(arr));

2.總結規律得到過程??

    //    有上述規律可見public static void selectSort(int[] arr) {for (int i = 0; i < arr.length; i++) {int minIndex = i;int min = arr[i];for (int j = 1 + i; j < arr.length; j++) {if (min > arr[j]) {min = arr[j];minIndex = j;}}if (minIndex != i) {arr[minIndex] = arr[i];arr[i] = min;}System.out.printf("第%d輪的遍歷為", i + 1);System.out.println(Arrays.toString(arr));}}

七、總結

????????盡管選擇排序在效率上相比其他高級排序算法如快速排序、歸并排序等存在劣勢,但在某些特定場景下仍有其獨特價值。例如,在內存資源非常有限的嵌入式系統或者硬件受限環境下,選擇排序可以作為備選方案。此外,由于其實現簡單,也常被用于教學示例,幫助初學者理解和掌握排序算法的基本思路。

????????選擇排序雖然在效率上并不占優,但在理解和實現上卻極為簡潔明了,對于初學者而言,它是理解排序算法原理的良好起點。在實際開發中,我們可以根據具體場景選擇更為高效的排序算法如快速排序、歸并排序等。然而,理解選擇排序的底層邏輯有助于我們更好地掌握其他復雜的排序算法,也是提升編程素養的重要一步。

?

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

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

相關文章

Leetcode 3067. Count Pairs of Connectable Servers in a Weighted Tree Network

Leetcode 3067. Count Pairs of Connectable Servers in a Weighted Tree Network 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3067. Count Pairs of Connectable Servers in a Weighted Tree Network 1. 解題思路 這一題沒想到什么好的方法&#xff0c;走的是暴力求解的路…

xss.haozi.me:0x07

<img src1 onerroralert(1)

Spring MVC ThemeResolver原理解析

在Spring MVC框架中&#xff0c;ThemeResolver&#xff08;主題解析器&#xff09;是一個重要但經常被忽視的組件。它負責解析和管理Web應用程序中的主題設置&#xff0c;允許用戶根據不同的需求和偏好切換界面主題。ThemeResolver為開發者提供了一種靈活的方式來控制應用程序的…

tomcat下載安裝配置教程

tomcat下載安裝配置教程 我是使用tomcat下載安裝及配置教程_tomcat安裝-CSDN博客 此貼來進行安裝配置&#xff0c;原文21年已經有些許不同。 下載tomcat 官網&#xff1a;http://tomcat.apache.org/ 我們老師讓安裝8.5以上&#xff0c;所以我直接選擇版本9 點擊9頁面之后…

DPDK常用API合集三

librte_timer 此庫為 DPDK 執行單元提供定時器服務&#xff0c;提供異步執行函數的能力。它可以是周期性的函數調用&#xff0c;也可以是一次性調用。它使用環境抽象層&#xff08;EAL&#xff09;提供的定時器接口獲取精確的時間參考&#xff0c;并可以根據需要以每個核心為基…

2024.03.03藍橋云課筆記——排序

sort簡介 #include<algorithm> 使用的是快速排序 時間復雜度為O(nlogn) sort使用(默認是從小到大) 1.sort(起始地址&#xff0c;結束地址的下一位&#xff0c;*比較函數&#xff09;&#xff1b; #include<iostream> #include<algorithm> using namesp…

HTTPS的實現原理

圖片來源&#xff1a;HTTPS 詳解一&#xff1a;附帶最精美詳盡的 HTTPS 原理圖 - 個人文章 - SegmentFault 思否 加密流程按圖中的序號分為&#xff1a; 客戶端請求 HTTPS 網址&#xff0c;然后連接到 server 的 443 端口 (HTTPS 默認端口&#xff0c;類似于 HTTP 的80端口)。…

Windows批處理:bat文件學習

目錄 第一章、快速了解Windows批處理1.1&#xff09;Windows批處理相關概念介紹1.1.1&#xff09;批處理的起源1.1.2&#xff09;bat文件介紹 1.2&#xff09;Demo1.2.1&#xff09;創建文件添加命令1.2.2&#xff09;bat腳本中的命令解釋 第二章、實例2.1&#xff09;點擊bat文…

navicat安裝11.3

一、安裝navicat 1、下載navicat 2、解壓壓縮包 3、點擊exe文件 4、輸入密鑰&#xff1a; NAVH-WK6A-DMVK-DKW3 5、點擊打開&#xff1a; 輸入連接參數&#xff1a; 6、查看連接好倉庫 7、 在使用navicat來編寫sql語句 8、編寫語句 連接不上問題&#xff0c;檢查問題&#…

[出錯]-RuntimeError: “slow_conv_transpose2d_out_cpu“ not implemented for ‘Byte‘

一開始我一直一維是torch版本的問題 輸入是用cv2讀出來的&#xff0c;數據類型dtype是默認是unit8&#xff0c;輸入到模型中&#xff0c;除了要將他轉為tenso以外&#xff0c;還要.float將數據類型轉為浮點數。

【Vue3】深入理解Vue中的ref屬性

&#x1f497;&#x1f497;&#x1f497;歡迎來到我的博客&#xff0c;你將找到有關如何使用技術解決問題的文章&#xff0c;也會找到某個技術的學習路線。無論你是何種職業&#xff0c;我都希望我的博客對你有所幫助。最后不要忘記訂閱我的博客以獲取最新文章&#xff0c;也歡…

Redis 之三:Redis 的發布訂閱(pub/sub)

概念介紹 Redis 發布訂閱 (pub/sub) 是一種消息通信模式&#xff0c;它允許客戶端之間進行異步的消息傳遞 Redis 客戶端可以訂閱任意數量的頻道。 模型中的角色 在該模型中&#xff0c;有三種角色&#xff1a; 發布者&#xff08;Publisher&#xff09;&#xff1a;負責發送信…

嵌入式中7個底層數據結構分解

在編程的世界里&#xff0c;數據結構是構建信息框架的骨架。就像現實生活中的建筑需要精心設計的結構一樣&#xff0c;我們的數據也需要合適的結構來保證程序的高效和穩定。今天&#xff0c;我們就像探險家一樣&#xff0c;一起去探索七大數據結構的奧秘&#xff0c;并揭開它們…

光路科技:工業以太網交換機引領工業互聯網新篇章

隨著全球范圍內工業4.0的浪潮不斷涌動&#xff0c;工業互聯網作為其核心驅動力&#xff0c;正引領著工業生產向智能化、網絡化的嶄新階段邁進。在這一轉型的浪潮中&#xff0c;光路科技憑借其卓越的工業互聯設備與創新解決方案&#xff0c;正為工業互聯網領域的發展注入新的活力…

Linux環境基礎開發工具使用

目錄 1.Linux軟件包管理器yum 什么是軟件包 關于 lrzsz 查看軟件包 2.Linux開發工具 2.1.vim的基本概念 2.2vim的基本操作 2.3vim命令模式命令集 1.插入模式 2.從插入模式切換為命令模式 3.移動光標 4.刪除文字 5.復制 6.替換 7.撤銷上一次的操作 8.更改 2.4v…

藍橋杯 2020 第一輪省賽 A 組 F 題(B 組 G 題)解碼

藍橋杯 2020 第一輪省賽 A 組 F 題&#xff08;B 組 G 題&#xff09;解碼 題目描述 小明有一串很長的英文字母&#xff0c;可能包含大寫和小寫。 在這串字母中&#xff0c;有很多連續的是重復的。小明想了一個辦法將這串字母表達得更短&#xff1a;將連續的幾個相同字母寫成…

[動態規劃]---part1

前言 作者&#xff1a;小蝸牛向前沖 專欄&#xff1a;小蝸牛算法之路 專欄介紹&#xff1a;"蝸牛之道&#xff0c;攀登大廠高峰&#xff0c;讓我們攜手學習算法。在這個專欄中&#xff0c;將涵蓋動態規劃、貪心算法、回溯等高階技巧&#xff0c;不定期為你奉上基礎數據結構…

Java基礎 - 模擬醫院掛號系統

模擬醫院掛號系統功能 1. 科室管理:新增科室,刪除科室(如果有醫生在,則不能刪除該科室),修改科室 2. 醫生管理:錄入醫生信息以及科室信息,修改醫生信息(主要是修改個人信息和科室) 3. 坐診信息設置:可以設置醫生當天和未來6天的坐診情況,包括上午和下午的坐診時…

Linux設備模型(九) - bus/device/device_driver/class

一&#xff0c;設備驅動模型 1&#xff0c;概述 在前面寫的驅動中&#xff0c;我們發現編寫驅動有個固定的模式只有往里面套代碼就可以了&#xff0c;它們之間的大致流程可以總結如下&#xff1a; 實現入口函數xxx_init()和卸載函數xxx_exit() 申請設備號 register_chrdev_r…

Spring源碼:手寫SpringDI

我們是在實現了SpringIOC的基礎上&#xff0c;進行拓展&#xff0c;IOC實現源碼可以查看&#xff1a;手寫SpringIOC 文章目錄 一、分析二、實現1、構造注入1&#xff09;分析2&#xff09;版本1BeanReferenceBeanDefinitionGenericBeanDefinitionDefaultBeanFactory1、改造構造…