【C語言-選擇排序算法】實現對十個數進行排序

目錄

前言

一、選擇排序算法原理

二、選擇排序算法實現對十個數進行排序

三、代碼運行示例

四、選擇排序算法的時間復雜度和空間復雜度分析

五、選擇排序算法的優缺點

六、總結


前言

????????在計算機科學領域,排序算法是基石般的存在,它們就像是整理雜亂數據的魔法,讓無序的數據變得井井有條。而選擇排序(Selection Sort),作為一種簡單直觀的排序算法,在學習排序的道路上是我們繞不開的經典算法之一。今天,我們一起探討如何使用 C 語言實現選擇排序算法,對十個數字進行排序,并詳細剖析其中的原理與細節。

一、選擇排序算法原理

????????選擇排序的核心思想可以用 “挑最小的放前面” 來概括。它的執行過程就像是在一群學生中,先找出最矮的學生站到隊伍最前面,然后在剩下的學生中再找出最矮的,依次類推,直到整個隊伍按照身高從矮到高排列整齊。

????????具體到數字排序上,在一個包含 n 個元素的數組中,選擇排序會在每一輪遍歷中,從待排序的元素中找出最小(或最大)的元素,將其與待排序序列的起始位置元素交換位置。每完成一輪遍歷,就會有一個元素被放置到它最終的正確位置上,經過 n - 1 輪遍歷后,整個數組就完成了排序。

????????例如,對于數組[5, 3, 8, 6, 7],第一輪遍歷會找出最小的元素3,將其與數組第一個元素5交換位置,得到[3, 5, 8, 6, 7];第二輪在剩余的[5, 8, 6, 7]中找出最小的5,由于它已經在正確位置,無需交換;第三輪在[8, 6, 7]中找出最小的6,與8交換,得到[3, 5, 6, 8, 7];第四輪在[8, 7]中找出最小的7,與8交換,最終得到有序數組[3, 5, 6, 7, 8] 。

二、選擇排序算法實現對十個數進行排序

????????在 C 語言中,我們可以通過以下代碼實現選擇排序算法對十個數字進行排序:

#include <stdio.h>// 選擇排序函數
void selectionSort(int arr[], int n) {int i, j, min_index, temp;for (i = 0; i < n - 1; i++) {min_index = i;for (j = i + 1; j < n; j++) {if (arr[j] < arr[min_index]) {min_index = j;}}// 交換找到的最小元素和當前位置元素temp = arr[min_index];arr[min_index] = arr[i];arr[i] = temp;}
}int main() {int numbers[10];printf("請輸入十個整數:\n");for (int i = 0; i < 10; i++) {scanf("%d", &numbers[i]);}selectionSort(numbers, 10);printf("排序后的結果為:\n");for (int i = 0; i < 10; i++) {printf("%d ", numbers[i]);}printf("\n");return 0;
}

代碼詳解:

選擇排序函數selectionSort

void selectionSort(int arr[], int n) {int i, j, min_index, temp;for (i = 0; i < n - 1; i++) {min_index = i;for (j = i + 1; j < n; j++) {if (arr[j] < arr[min_index]) {min_index = j;}}// 交換找到的最小元素和當前位置元素temp = arr[min_index];arr[min_index] = arr[i];arr[i] = temp;}
}
  • 函數參數:arr是要排序的數組,n是數組的元素個數。
  • 外層循環:for (i = 0; i < n - 1; i++),控制排序的輪數。因為經過n - 1輪,就可以將n個元素全部放置到正確位置,所以循環次數為n - 1。
  • 內層循環:for (j = i + 1; j < n; j++),用于在每一輪中從 i + 1 位置開始遍歷數組,找出剩余元素中的最小元素的下標,并將其存儲在min_index中。在遍歷過程中,通過 if (arr[j] < arr[min_index]) 比較元素大小,如果找到比當前最小元素更小的元素,就更新min_index。
  • 交換操作:找到最小元素的下標min_index后,通過中間變量temp將最小元素與當前位置(i位置)的元素進行交換,即:
temp = arr[min_index];
arr[min_index] = arr[i];
arr[i] = temp;

????????這樣就將當前輪找到的最小元素放置到了它應該在的位置上。

主函數main

int main() {int numbers[10];printf("請輸入十個整數:\n");for (int i = 0; i < 10; i++) {scanf("%d", &numbers[i]);}selectionSort(numbers, 10);printf("排序后的結果為:\n");for (int i = 0; i < 10; i++) {printf("%d ", numbers[i]);}printf("\n");return 0;
}
  • 首先定義一個長度為 10 的整型數組numbers,用于存儲用戶輸入的十個數字。
  • 通過for循環和scanf函數,提示用戶輸入十個整數,并將輸入的數字依次存儲到數組numbers中。
  • 調用selectionSort函數對numbers數組進行排序,傳入數組名和數組元素個數 10。
  • 最后再通過一個for循環和printf函數,將排序后的數組元素依次輸出,展示排序結果。

三、代碼運行示例

????????假設我們輸入十個數字:9 5 2 7 1 8 3 6 4 0,程序運行后,會輸出排序后的結果:0 1 2 3 4 5 6 7 8 9 。每一個數字都按照從小到大的順序被正確排列,這正是選擇排序算法發揮作用的結果。

四、選擇排序算法的時間復雜度和空間復雜度分析

時間復雜度

????????選擇排序的時間復雜度主要取決于兩層嵌套循環。外層循環執行 n - 1 次,內層循環在第i次外層循環時執行 n - i 次。總的比較次數為(n - 1) + (n - 2) +... + 1 = n * (n - 1) / 2,所以選擇排序的時間復雜度為O(n^2),其中n是數組元素的個數。這意味著,隨著數組規模的增大,選擇排序所需的時間會呈平方級增長,在處理大規模數據時效率較低。

空間復雜度

????????在選擇排序過程中,除了原數組外,只使用了幾個額外的變量(如min_index、temp等)來輔助排序,這些變量所占用的空間是固定的,不隨數組規模的變化而變化。因此,選擇排序的空間復雜度為O(1),屬于原地排序算法,不需要額外開辟大量的內存空間。

五、選擇排序算法的優缺點

優點:?

  • 簡單直觀:選擇排序的原理和實現都非常簡單,對于初學者來說,很容易理解和掌握,是學習排序算法的良好入門選擇。?
  • 穩定且原地排序:在不考慮相等元素交換的情況下,選擇排序是一種穩定的排序算法(如果在比較時遇到相等元素不交換位置,就能保證相等元素的相對順序不變)。并且它不需要額外的大量內存空間,只需要幾個輔助變量,空間復雜度低,適合在內存資源有限的環境下使用。?

缺點:?

  • 效率較低:由于其時間復雜度為O(n^2),在處理大規模數據時,排序所需的時間會急劇增加,相比一些高效的排序算法(如快速排序、歸并排序等),性能較差。?
  • 交換次數較多:在選擇排序過程中,即使數據已經部分有序,它仍然會按照固定的方式進行比較和交換操作,沒有利用數據已有的有序性,這也是導致其效率低下的一個原因。

六、總結

????????通過以上詳細的講解和代碼實現,我們深入了解了選擇排序算法,并成功使用 C 語言對十個數字進行了排序。選擇排序雖然在處理大規模數據時效率不高,但它簡單易懂的特性使其成為學習排序算法的重要基礎。同時,通過對選擇排序的學習,我們也對 C 語言數組的操作、循環結構以及函數的使用有了更深入的理解。在實際編程中,我們可以根據具體的數據規模和需求,選擇合適的排序算法來提高程序的性能和效率。希望本文能幫助大家更好地掌握選擇排序算法。

????????如果你對選擇排序算法還有其他疑問或文章中有不對的地方,歡迎交流指正!

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

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

相關文章

配置Intel Realsense D405驅動與ROS包

配置sdk使用 Ubuntu20.04LTS下安裝Intel Realsense D435i驅動與ROS包_realsense的驅動包-CSDN博客 中的方法一 之后不通過apt安裝包&#xff0c;使用官方的安裝步驟直接clone https://github.com/IntelRealSense/realsense-ros/tree/ros1-legacy 從這一步開始 執行完 這一步…

基于SpringBoot的中華詩詞文化分享平臺-項目分享

基于SpringBoot的中華詩詞文化分享平臺-項目分享 項目介紹項目摘要管理員功能圖會員功能圖系統功能圖項目預覽會員主頁面詩詞頁面發布問題回復評論 最后 項目介紹 使用者&#xff1a;管理員、會員 開發技術&#xff1a;MySQLJavaSpringBootVue 項目摘要 本文旨在設計與實現一…

ProxySQL 性能調優工具推薦

ProxySQL 的性能優化需結合?實時監控工具?與?自動化分析平臺?,以下為常用工具分類與推薦: 一、?內置診斷工具? ProxySQL Admin 接口? 通過內置管理表直接分析性能數據: sql Copy Code SELECT * FROM stats_mysql_query_digest; – 高頻查詢分析(執行次數、平均耗…

unity TEngine學習記錄3

上一篇講了怎么使用te框架&#xff0c;本篇主要學習的是UI&#xff0c;一個游戲百分之70%都是UI的展示效果&#xff0c;現在讓我們繼續打開te官網找到UI部分繼續學習。 ui創建以及加載 我們根據文檔首先打開命名規則界面,大家第一次看就知道這個是干啥的&#xff0c;你想使用此…

23種設計模式-創建型模式之單例模式(Java版本)

Java 單例模式&#xff08;Singleton Pattern&#xff09;詳解 &#x1f31f; 什么是單例模式&#xff1f; 單例模式確保一個類只有一個實例&#xff0c;并提供一個全局訪問點來訪問它。 &#x1f9e0; 使用場景 配置管理類&#xff08;如讀取配置文件&#xff09;日志工具類…

2025能源網絡安全大賽CTF --- Crypto wp

文章目錄 前言simpleSigninNumberTheory 前言 大半年以來寫的第一篇文章&#xff01;&#xff01;&#xff01; simpleSignin 題目&#xff1a; from Crypto.Util.number import * from gmpy2 import * import osflag bxxx p next_prime(bytes_to_long(os.urandom(128))…

加密與解密完全指南,使用Java實現

文章目錄 1. 加密基礎知識1.1 什么是加密&#xff1f;1.2 加密的歷史簡介1.2.1 古典加密1.2.2 現代加密的起源 1.3 加密的基本概念1.3.1 密碼學中的關鍵術語1.3.2 加密的基本原則 1.4 加密的分類1.4.1 對稱加密&#xff08;Symmetric Encryption&#xff09;1.4.2 非對稱加密&a…

十一、數據庫day03--SQL語句02

文章目錄 一、查詢語句1. 基本查詢2. 條件查詢2.1 ?較運算符&邏輯運算符2.2 模糊查詢2.3 范圍查詢2.4 判斷空 3. 其他復雜查詢3.1 排序3.2 聚合函數3.3 分組3.4 分頁查詢 二、回顧1. 使? Navicat ?具中的命令列2.命令?基本操作步驟 提示&#xff1a;以下是本篇文章正文…

Flowable 與 bpmn.io@7.0 完整集成示例 Demo

Flowable 與 bpmn.io7.0 完整集成示例 Demo 下面是一個完整的前后端集成示例&#xff0c;包含前端使用 bpmn.js 7.0 和與 Flowable 后端交互的實現。 1. 后端實現 (Spring Boot Flowable) 1.1 添加依賴 (pom.xml) <dependencies><!-- Spring Boot --><depe…

ROS2 安裝詳細教程,Ubuntu 22.04.5 LTS 64 位 操作系統

一、完整安裝流程&#xff08;推薦&#xff09; 1. 安裝依賴工具 sudo apt update && sudo apt install -y software-properties-common curl gnupg2 2. 添加 ROS 2 GPG 密鑰 sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /…

STM32 基本GPIO控制

目錄 GPIO基礎知識 ?編輯IO八種工作模式 固件庫實現LED點燈 蜂鳴器 按鍵基礎知識 ?編輯繼電器 震動傳感器 433M無線模塊 GPIO基礎知識 GPIO(General-Purpose input/output,通用輸入/輸出接口) 用于感知外部信號&#xff08;輸入模式&#xff09;和控制外部設備&…

14.Chromium指紋瀏覽器開發教程之WebGL指紋定制

WebGL指紋概述 當在瀏覽器打開的網頁上瀏覽內容時&#xff0c;看到的大多是平面的、靜態的圖像和文字。但是有時想要在網頁上看到更加生動、立體的圖像&#xff0c;如3D游戲、虛擬現實應用等。這時&#xff0c;就需要用到WebGL。 簡單來說&#xff0c;WebGL&#xff08;Web G…

C# foreach 循環中獲取索引的完整方案

一、手動維護索引變量 ?實現方式?&#xff1a; 在循環外部聲明索引變量&#xff0c;每次迭代手動遞增&#xff1a; int index 0; foreach (var item in collection) { Console.WriteLine($"{index}: {item}"); index; } ?特點?&#xff1a; 簡單直接&#…

Android 下拉欄中的禁用攝像頭和麥克風隱藏

Android 下拉欄中的禁用攝像頭和麥克風隱藏 文章目錄 Android 下拉欄中的禁用攝像頭和麥克風隱藏一、前言二、下拉框中的禁用攝像頭和麥克風隱藏實現1、設置支持屬性為false2、修改代碼 三、其他1、下拉欄中的禁用攝像頭和麥克風隱藏小結2、 Android SensorPrivacyService ps&a…

數字后端設計 (四):時鐘樹綜合——讓芯片的「心跳」同步到每個角落

—— 試想全城的人要在同一秒按下開關——如果有的表快、有的表慢&#xff0c;結果會亂套&#xff01;時鐘樹綜合就是給芯片內部裝一套精準的“廣播對時系統”&#xff0c;讓所有電路踩著同一個節拍工作。 1. 為什么時鐘如此重要&#xff1f; 芯片的「心跳」&#xff1a;時鐘信…

華為網路設備學習-19 路由策略

一、 二、 注意&#xff1a; 當該節點匹配模式為permit下時&#xff0c;參考if else 當該節點匹配模式為deny下時&#xff1a; 1、該節點中的apply子語句不會執行。 2、如果滿足所有判斷&#xff08;if-match&#xff09;條件時&#xff0c;拒絕該節點并跳出&#xff08;即不…

機器學習決策樹

一、何為決策樹 決策樹&#xff08;Decision Tree&#xff09;是一種分類和回歸方法&#xff0c;是基于各種情況發生的所需條件構成決策樹&#xff0c;以實現期望最大化的一種圖解法。由于這種決策分支畫成圖形很像一棵樹的枝干&#xff0c;故稱決策樹。它的運行機制非常通俗易…

香港服務器CPU對比:Intel E3與E5系列核心區別與使用場景

香港服務器的 CPU 配置(核心數與主頻)直接決定了其并發處理能力和數據運算效率&#xff0c;例如高頻多核處理器可顯著提升多線程任務響應速度。在實際業務場景中&#xff0c;不同負載需求對 CPU 架構的要求存在顯著差異——以 Intel E3 和 E5 系列為例&#xff0c;由于兩者在性…

【Rust 精進之路之第8篇-工具賦能】深入 Cargo:依賴管理、構建配置與工作空間 (Workspace)

系列: Rust 精進之路:構建可靠、高效軟件的底層邏輯 作者: 碼覺客 發布日期: 2025-04-20 引言:超越構建,Cargo 是 Rust 生態的引擎 在我們的 Rust 學習之旅初期(第二篇),我們已經與 Cargo 有過初步的接觸。我們學會了使用 cargo new 創建項目骨架,用 cargo build 編…

#systemverilog# 進程控制問題#(八)關于#0 問題的使用(三)

今天,我們繼續研究一下上一節討論的問題。其實,還有一個小問題,我們來探討一下。 `timescale 1ns/10psmodule tb_top(); reg clk; reg reset;initial begin reset = 0; #10 reset = 1; #15 reset = 0; #50 $finish; endinitial beginfor(int i = 0; i < 4 ; i++)fork #…