C語言——排序(冒泡,選擇,插入)

基本概念

????????排序是對數據進行處理的常見操作,即將數據按某字段規律排列。字段是數據節點的一個屬性,比如學生信息中的學號、分數等,可針對這些字段進行排序。同時,排序算法有穩定性之分,若兩個待排序字段一致的數據在排序前后相對位置不變,則該排序算法是穩定的,否則不穩定。此外,根據數據量與內存的關系,還分為內排序(數據量小,可全部裝入內存處理)和外排序(數據量大,需暫存外存,分批次讀入內存處理)。

一、冒泡排序

(一)核心思想

????????冒泡排序基于相鄰元素比較的思路。從頭到尾讓每兩個相鄰元素進行比較,若順序符合排序要求則保持位置不變,若為逆序則交換位置。經過一輪比較,序列中具有 “極值”(最大值或最小值,取決于排序順序)的數據會被挪至序列末端。

????????例如,對于數組[5, 3, 8, 6, 2]進行升序排序,從第一個元素開始,5 和 3 比較,因為 5 > 3,所以交換位置,數組變為[3, 5, 8, 6, 2];接著 5 和 8 比較,順序不變;8 和 6 比較,交換位置,數組變為[3, 5, 6, 8, 2];8 和 2 比較,交換位置,第一輪比較結束后數組變為[3, 5, 6, 2, 8]。可以看到,最大的數 8 被移到了數組末尾。若序列中有n個數據,在最極端情況下,經過n - 1輪比較一定能將所有數據排序完畢。

(二)代碼實現

?
// 冒泡排序,data為數組,len為數組長度
void bubbleSort(int* data, int len) {int i, j;for (i = 0; i < len - 1; i++) {int flag = 1;  // 用于標記某一趟是否有元素交換,若沒有則說明已排序完成for (j = 0; j < len - 1 - i; j++) {if (data[j] > data[j + 1]) {  // 升序排序,若要降序改為data[j] < data[j + 1]int tmp;tmp = data[j];data[j] = data[j + 1];data[j + 1] = tmp;flag = 0;  // 有元素交換,標記為0}}if (flag) {  // 若某一趟沒有元素交換,提前結束排序break;}}
}?

(三)性能分析

????????冒泡排序的時間復雜度為 O(n^2),其中n是待排序數據的數量。這是因為在最壞情況下,需要進行n - 1輪比較,每輪比較的次數從n - 1逐漸減少到 1。空間復雜度為 O(1),因為它只需要幾個臨時變量來進行元素交換,不需要額外的大量空間。冒泡排序是一種穩定的排序算法,因為相同元素的相對順序在排序過程中不會改變。

(四)示例圖示

冒泡排序

以數組[5, 3, 8, 6, 2]的升序排序為例:

第一輪:

  • 比較 5 和 3,交換,數組變為[3, 5, 8, 6, 2]
  • 比較 5 和 8,順序不變
  • 比較 8 和 6,交換,數組變為[3, 5, 6, 8, 2]
  • 比較 8 和 2,交換,數組變為[3, 5, 6, 2, 8]

第二輪:

  • 比較 3 和 5,順序不變
  • 比較 5 和 6,順序不變
  • 比較 6 和 2,交換,數組變為[3, 5, 2, 6, 8]

第三輪:

  • 比較 3 和 5,順序不變
  • 比較 5 和 2,交換,數組變為[3, 2, 5, 6, 8]

第四輪:

  • 比較 3 和 2,交換,數組變為[2, 3, 5, 6, 8],排序完成。

二、選擇排序

(一)核心思想

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

????????例如,對于數組[5, 3, 8, 6, 2]進行升序排序,第一輪從數組中找到最小的數 2,與第一個數 5 交換位置,數組變為[2, 3, 8, 6, 5];第二輪從剩下的[3, 8, 6, 5]中找到最小的數 3,由于它已經在正確位置,無需交換;第三輪從[8, 6, 5]中找到最小的數 5,與 8 交換位置,數組變為[2, 3, 5, 6, 8];第四輪從[6, 8]中找到最小的數 6,由于它已經在正確位置,無需交換,此時數組已排序完成。

(二)代碼實現

?
// 選擇排序,data為數組,len為數組長度
void selectionSort(int* data, int len) {int i, j, minIndex;for (i = 0; i < len - 1; i++) {minIndex = i;for (j = i + 1; j < len; j++) {if (data[j] < data[minIndex]) {  // 升序排序,若要降序改為data[j] > data[minIndex]minIndex = j;}}if (minIndex != i) {int tmp = data[i];data[i] = data[minIndex];data[minIndex] = tmp;}}
}?

(三)性能分析

????????選擇排序的時間復雜度同樣為 O(n^2),因為無論數據初始狀態如何,都需要進行n - 1輪選擇和交換操作。空間復雜度為 O(1),只需要幾個臨時變量。選擇排序是一種不穩定的排序算法,例如數組[5, 5, 3]進行升序排序時,兩個 5 的相對順序可能會改變。

(四)示例圖示

選擇排序

以數組[5, 3, 8, 6, 2]的升序排序為例:

第一輪:

找到最小的 2,與 5 交換,數組變為[2, 3, 8, 6, 5]

第二輪:

在剩下的[3, 8, 6, 5]中找到最小的 3,位置不變

第三輪:

[8, 6, 5]中找到最小的 5,與 8 交換,數組變為[2, 3, 5, 6, 8]

第四輪:

[6, 8]中找到最小的 6,位置不變,排序完成。

三、插入排序

(一)核心思想

????????插入排序假設前面已經有i個節點是有序的,那么從第i + 1個節點開始,插入到前面i個節點的合適位置中。由于第一個元素自身總是有序的,因此從第 2 個元素開始,不斷插入前面的有序序列,直到全部排列完畢。

????????例如,對于數組[5, 3, 8, 6, 2]進行升序排序,初始時認為第一個元素 5 是有序的。然后取第二個元素 3,將其與 5 比較,因為 3 < 5,所以將 5 后移一位,把 3 插入到 5 原來的位置,數組變為[3, 5, 8, 6, 2];接著取第三個元素 8,由于 8 > 5,所以 8 的位置不變,數組仍為[3, 5, 8, 6, 2];再取第四個元素 6,將其依次與 8、5 比較,找到合適位置插入,數組變為[3, 5, 6, 8, 2];最后取第五個元素 2,將其依次與 8、6、5、3 比較,找到合適位置插入,數組變為[2, 3, 5, 6, 8]

(二)代碼實現

?
// 插入排序,data為數組,len為數組長度
void insertionSort(int* data, int len) {int i, j, tmp;for (i = 1; i < len; i++) {tmp = data[i];j = i - 1;while (j >= 0 && data[j] > tmp) {  // 升序排序,若要降序改為data[j] < tmpdata[j + 1] = data[j];j--;}data[j + 1] = tmp;}
}?

(三)性能分析

????????插入排序在最好情況下(數據已經有序)的時間復雜度為 O(n),因為只需要進行n - 1次比較,無需移動元素。在最壞情況下(數據逆序)的時間復雜度為 O(n^2),平均時間復雜度也為O(n^2)。空間復雜度為 O(1),只需要幾個臨時變量。插入排序是一種穩定的排序算法,因為在插入過程中,相同元素的相對順序不會改變。

(四)示例圖示

插入排序

以數組[5, 3, 8, 6, 2]的升序排序為例:

第一輪:

3 插入到 5 前面,數組變為[3, 5, 8, 6, 2]

第二輪:

8 位置不變,數組仍為[3, 5, 8, 6, 2]

第三輪:

6 插入到 8 前面,數組變為[3, 5, 6, 8, 2]

第四輪:

2 插入到最前面,數組變為[2, 3, 5, 6, 8],排序完成。

總結

冒泡排序、選擇排序和插入排序都是簡單的排序算法,它們的時間復雜度在最壞情況下都O(n^2),空間復雜度為O(1),適用于數據樣本較小的場合。其中,冒泡排序和插入排序是穩定的排序算法,選擇排序是不穩定的排序算法。在實際應用中,可根據數據特點和需求選擇合適的排序算法。

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

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

相關文章

滲透利器:YAKIT 工具-基礎實戰教程.

YAKIT 工具-基礎實戰教程. YAKIT&#xff08;Yak Integrated Toolkit&#xff09;是一款基于Yak語言開發的集成化網絡安全單兵工具&#xff0c;旨在覆蓋滲透測試全流程&#xff0c;提供從信息收集、漏洞掃描到攻擊實施的自動化支持。其核心目標是通過GUI界面降低Yak語言的使用…

CRISPR spacers數據庫;CRT和PILER-CR用于MAGs的spacers搜索

iPHoP&#xff1a;病毒宿主預測-CSDN博客 之前介紹了這個方法來預測病毒宿主&#xff0c;今天來介紹另一種比較用的多的方法CRISPR比對 CRISPR spacers數據庫 Dash 在這可以下載作者搜集的spacers用于后期比對 CRT和PILER-CR 使用 CRT 和 PILERCR 識別 CRISPR 間隔區&#x…

模糊聚類分析方法:從模糊等價矩陣到動態分類

一、模糊聚類分析的核心思想 在實際工程技術和經濟管理問題中&#xff0c;我們常常需要對對象進行分類。例如&#xff0c;根據生物特征對物種分類、根據氣候特征對城市分類、根據用戶行為對客戶群體分類等。傳統的聚類分析基于清晰的分類邊界&#xff0c;但現實中許多分類問題…

DeepSeek從入門到精通:提示詞設計的系統化指南

目錄 引言&#xff1a;AIGC時代的核心競爭力 第一部分 基礎篇&#xff1a;提示詞的本質與核心結構 1.1 什么是提示詞&#xff1f; 1.2 提示詞的黃金三角結構 第二部分 類型篇&#xff1a;提示詞的六大范式 2.1 提示語的本質特征 2.2 提示語的類型 2.2.1 指令型提示詞 …

【EDA學習】嘉立創題庫

一、多選題 1.嘉立創題庫的作用是什么&#xff0c;以下描述正確的是&#xff1f; A.提供學習平臺&#xff0c;幫助客戶了解嘉立創工藝 B.可成為嘉立創客戶所在企業的內部培訓資料&#xff0c;打通設計與制造&#xff0c;提高產品研發效率&#xff0c;降本增效 C.可成為嘉立創客…

Python PyCharm DeepSeek接入

Python PyCharm DeepSeek接入 創建API key 首先進入DeepSeek官網&#xff0c;https://www.deepseek.com/ 點擊左側“API Keys”&#xff0c;創建API key&#xff0c;輸出名稱為“AI” 點擊“創建"&#xff0c;將API key保存&#xff0c;復制在其它地方。 在PyCharm中下…

對界面簡單易用封裝SDK

1.三大接口 1.CheckTuple package com.x.globalcommonservice.model.permissioncontrolservice.openfga.service;import com.x.globalcommonservice.global.exception.CodeException; import com.x.globalcommonservice.model.permissioncontrolservice.openfga.dto.tuple.Op…

【Pico】使用Pico進行無線串流搜索不到電腦

使用Pico進行無線串流搜索不到電腦 官串方式&#xff1a;使用Pico互聯連接電腦。 故障排查 以下來自官方文檔 請按照以下步騾排除故障&#xff1a; 確認電腦和一體機連接了相同的路由器WiFi網絡(相同網段) IP地址通常為192.168.XX&#xff0c;若兩設備的IP地址前三段相同&…

[免費]Springboot+Vue醫療(醫院)掛號管理系統【論文+源碼+SQL腳本】

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;看到一個不錯的SpringbootVue醫療(醫院)掛號管理系統&#xff0c;分享下哈。 項目視頻演示 【免費】SpringBootVue醫療(醫院)掛號管理系統 Java畢業設計_嗶哩嗶哩_bilibili 項目介紹 在如今社會上&#xff0c;關于信息上…

【一文讀懂】WebRTC協議

WebRTC&#xff08;Web Real-Time Communication&#xff09;協議 WebRTC&#xff08;Web Real-Time Communication&#xff09;是一種支持瀏覽器和移動應用程序之間進行 實時音頻、視頻和數據通信 的協議。它使得開發者能夠在瀏覽器中實現高質量的 P2P&#xff08;點對點&…

沃德校園助手系統php+uniapp

一款基于FastAdminThinkPHPUniapp開發的為校園團隊提供全套的技術系統及運營的方案&#xff08;目前僅適配微信小程序&#xff09;&#xff0c;可以更好的幫助你打造自己的線上助手平臺。成本低&#xff0c;見效快。各種場景都可以自主選擇服務。 更新日志 V1.2.1小程序需要更…

Linux 系統上以 root 用戶身份運行 ./mysql.server start 命令,但仍然收到 “Permission denied” 錯誤

如圖 1 所示&#xff0c;當在 Linux 系統上以 root 用戶身份運行 ./mysql.server start 命令&#xff0c;但仍然收到 “Permission denied” 錯誤時&#xff0c;這通常不是由于權限不足&#xff08;因為您已經是 root 用戶&#xff09;&#xff0c;而可能是由于 mysql.server 腳…

Android的Activity生命周期知識點總結,詳情

一. Activity生命周期 1.1 返回棧知識點 二. Activity狀態 2.1 啟動狀態 2.2 運行狀態 2.3 暫停狀態 2.4 停止狀態 2.5 銷毀狀態 三. Activity生存期 3.1 回調方法 3.2 生存期 四. 體驗Activity的生命周期 五. Activity被回收辦法 引言&#xff1a; 掌握Acti…

Python----PyQt開發(PyQt基礎,環境搭建,Pycharm中PyQttools工具配置,第一個PyQt程序)

一、QT與PyQT的概念和特點 1.1、QT QT是一個1991年由The Qt Company開發的跨平臺C圖形用戶界面應用程序開發 框架&#xff0c;可構建高性能的桌面、移動及Web應用程序。也可用于開發非GUI程序&#xff0c;比如 控制臺工具和服務器。Qt是面向對象的框架&#xff0c;使用特殊的代…

win10 系統 自定義Ollama安裝路徑 及模型下載位置

win10 系統 自定義Ollama安裝路徑 及模型下載位置 由于Ollama的exe安裝軟件雙擊安裝的時候默認是在C盤&#xff0c;以及后續的模型數據下載也在C盤&#xff0c;導致會占用C盤空間&#xff0c;所以這里單獨寫了一個自定義安裝Ollama安裝目錄的教程。 Ollama官網地址&#xff1…

微軟官方出品GPT大模型編排工具:7個開源項目

今天一起盤點下&#xff0c;12月份推薦的7個.Net開源項目&#xff08;點擊標題查看詳情&#xff09;。 1、一個瀏覽器自動化操作的.Net開源庫 這是一個基于 Google 開源的 Node.js 庫 Puppeteer 的 .NET 開源庫&#xff0c;方便開發人員使用無頭 Web 瀏覽器抓取 Web、檢索 Ja…

蘋果CMS站群插件的自動生成功能:提升網站流量的秘訣

引言 在數字營銷的浪潮中&#xff0c;站群技術因其強大的流量引導能力而備受青睞。蘋果CMS作為一款優秀的內容管理系統&#xff0c;憑借其靈活性和可擴展性&#xff0c;成為了站群管理的理想選擇。本文將詳細介紹蘋果CMS站群插件的自動生成功能&#xff0c;探討如何通過這一功…

VS Code User和System版區別【推薦使用System版本】and VSCode+Keil協同開發之Keil Assistant

VS Code User和System版區別 Chapter1 VS Code User和System版區別1. 對于安裝而言2. 結束語 Chapter2 VS Code 安裝、配置教程及插件推薦插件&#xff1a; Chapter3 VSCodeKeil協同開發之Keil Assistant1. 效果展示2. Keil Assistant簡介3. Keil Assistant功能特性4. 部署步驟…

大語言模型入門

大語言模型入門 1 大語言模型步驟1.1 pre-training 預訓練1.1.1 從網上爬數據1.1.2 tokenization1.1.2.1 tokenization using byte pair encoding 1.3 預訓練1.3.1 context1.3.2 training1.3.3 輸出 1.2 post-training1&#xff1a;SFT監督微調1.2.1 token 1.3 強化學習1.3.1 基…

DeepSeek R1 本地部署和知識庫搭建

一、本地部署 DeepSeek-R1&#xff0c;是幻方量化旗下AI公司深度求索&#xff08;DeepSeek&#xff09;研發的推理模型 。DeepSeek-R1采用強化學習進行后訓練&#xff0c;旨在提升推理能力&#xff0c;尤其擅長數學、代碼和自然語言推理等復雜任務 。 使用DeepSeek R1, 可以大大…