【算法】(C語言):冒泡排序、選擇排序、插入排序

冒泡排序

  1. 從第一個數據開始到第n-1個數據,依次和后面一個數據兩兩比較,數值小的在前。最終,最后一個數據(第n個數據)為最大值。
  2. 從第一個數據開始到第n-2個數據,依次和后面一個數據兩兩比較,數值小的在前。最終,倒數第二個數據(第n-1個數據)為第二個最大值。
  3. 從第一個數據開始到第n-3個數據,依次和后面一個數據兩兩比較,數值小的在前。最終,倒數第三個數據(第n-2個數據)為第三個最大值。
  4. 最多重復操作n-1次。

時間復雜度:最好情況 O(n),最壞情況 O(n^{2}),平均情況 O(n^{2})

  • 若已是排好的,從開頭到最后,兩兩比對,需要n-1次比對,無需交換,一輪結束,則時間約n,即 O(n)。
  • 若是亂序,則需最多n-1次重復操作,雖然每次重復操作的比對次數減1,但總時間約n^{2},即O(n^{2})。

空間復雜度:O(1)

  • 在原位置排序,只重復使用了用于交換的臨時空間,不隨數據量的變動而變動,空間使用為常量(1)。


C語言實現:(bubblesort.c)

#include <stdio.h>/* function prototype */
void bubble(int *, int);	// bubble sort
void traverse(int *, int);	// show element one by one/* main function */
int main(void)
{int arr[] = {4,2,6,9,5,1,3};int n = sizeof(arr) / sizeof(int);traverse(arr, n);bubble(arr, n);	printf("[ after bubble sort ] ");traverse(arr, n);return 0;
}/* subfunction */
void bubble(int *array, int length)		// bubble sort
{for(int i = length - 1; i > 0; i--){int ischange = 0;for(int j = 0; j < i; j++){if(array[j] > array[j+1]){int tmp = array[j];array[j] = array[j+1];array[j+1] = tmp;ischange = 1;}}if(ischange == 0) return ;}
}void traverse(int *array, int length)		// show element one by one
{printf("elements(%d): ", length);for(int k = 0; k < length; k++){printf("%d  ", array[k]);}printf("\n");
}

編譯鏈接: gcc -o bubblesort bubblesort.c

執行可執行文件: ./bubblesort



選擇排序

  1. 從第一個數據開始到最后,挑選最小值,放入第一個位置。
  2. 從第二個數據開始到最后,挑選最小值,放入第二個位置。
  3. 從第三個數據開始到最后,挑選最小值,放入第三個位置。
  4. 共重復操作n-1次。

時間復雜度:最好情況 O(n^{2}),最壞情況 O(n^{2}),平均情況 O(n^{2})

  • 從開頭到最后,挑選最小值,需要n-1次比對。重復n-1次操作,雖然每次重復操作的比對次數減1,但總時間約n^{2},即O(n^{2})。

空間復雜度:O(1)

  • 在原位置排序,只重復使用了用于交換的臨時空間,不隨數據量的變動而變動,空間使用為常量(1)。


C語言實現:(selectsort.c)

#include <stdio.h>/* function prototype */
void select(int *, int); 	// select sort
void traverse(int *, int);	// show element one by one/* main function */
int main(void)
{int arr[] = {4,2,6,9,5,1,3};int n = sizeof(arr) / sizeof(int);traverse(arr, n);select(arr, n);printf("[ after select sort ] ");traverse(arr, n);return 0;
}/* subfunction */
int findmin(int *array, int m, int n)		// find the minimum data, return index
{int minindex = m, mindata = array[m];int j;for(j = m + 1; j < n; j++){if(mindata > array[j]){minindex = j;mindata = array[j];}}return minindex;
}void select(int *array, int length)	 	// select sort
{for(int i = 0; i < length - 1; i++){int min = findmin(array, i, length);if(i != min){int tmp = array[i];array[i] = array[min];array[min] = tmp;}}
}void traverse(int *array, int length)		// show element one by one
{printf("elements(%d): ", length);for(int k = 0; k < length; k++){printf("%d  ", array[k]);}printf("\n");
}

編譯鏈接: gcc -o selectsort selectsort.c

執行可執行文件: ./selectsort



插入排序

  1. 第二個數據和第一個數據,兩兩比較,數值小的在前。
  2. 從第三個數據開始到第一個數據,依次和前面一個數據兩兩比較,數值小的在前。
  3. 從第四個數據開始到第一個數據,依次和前面一個數據兩兩比較,數值小的在前。
  4. 最多重復操作n-1次。

時間復雜度:最好情況 O(n),最壞情況 O(n^{2}),平均情況 O(n^{2})

  • 若已是排好的,無需交換,從第二個數據到最后,依次只需和前面一個數據兩兩比對,需要n-1次比對,則時間約n,即 O(n)。
  • 若是亂序,則除了和前面數據兩兩比對(需n-1次比對),還需重復往前比對,最多比對n-1次,總時間約n^{2},即O(n^{2})。

空間復雜度:O(1)

  • 在原位置排序,只重復使用了用于交換的臨時空間,不隨數據量的變動而變動,空間使用為常量(1)。


C語言實現:(insertsort.c)

#include <stdio.h>/* function prototype */
void insertsort(int *, int);		// insert sort
void traverse(int *, int);		// show element one by one/* main function */
int main(void)
{int arr[] = {4,2,6,9,5,1,3};int n = sizeof(arr) / sizeof(int);traverse(arr, n);insertsort(arr, n);printf("[ after insert sort ] ");traverse(arr, n);return 0;
}/* subfunction */
void insertsort(int *array, int length)	// insert sort
{int ischange = 0;for(int i = 1; i < length; i++){for(int j = i; j >= 0; j--){if(array[j-1] > array[j]){int tmp = array[j];array[j] = array[j-1];array[j-1] = tmp;ischange = 1;}if(ischange == 0) return ;}}
}void traverse(int *array, int length)		// show element one by one
{printf("element(%d): ", length);for(int k = 0; k < length; k++){printf("%d  ", array[k]);}printf("\n");
}

編譯鏈接: gcc -o?insertsort insertsort.c

執行可執行文件: ./insertsort

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

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

相關文章

關于用戶咨詢華為擎云L410筆記本安裝Windows系統的說明

同樣也是單位購買的華為擎云L410 KLVU-WDU0筆記本電腦&#xff0c;國產UOS系統某些軟件用著不是很方便&#xff0c;用戶咨詢是否能夠安裝Windows10或者Windows7&#xff1f; 帶著種種疑問也做了一些查詢&#xff0c;之前也給一些國產設備更改過操作系統&#xff0c;之前的國產設…

計算機網絡淺談—什么是 OSI 模型?

開放系統通信&#xff08;OSI&#xff09;模型是一個代表網絡通信工作方式的概念模型。 思維導圖 什么是 OSI 模型&#xff1f; 開放系統互連 (OSI) 模型是由國際標準化組織創建的概念模型&#xff0c;支持各種通信系統使用標準協議進行通信。簡單而言&#xff0c;OSI 為保證…

智能交通(3)——Learning Phase Competition for Traffic Signal Control

論文分享 https://dl.acm.org/doi/pdf/10.1145/3357384.3357900https://dl.acm.org/doi/pdf/10.1145/3357384.3357900 論文代碼 https://github.com/gjzheng93/frap-pubhttps://github.com/gjzheng93/frap-pub 摘要 越來越多可用的城市數據和先進的學習技術使人們能夠提…

Laravel框架詳解及使用方法

Laravel是一款開源的PHP Web應用程序框架&#xff0c;它基于MVC&#xff08;模型-視圖-控制器&#xff09;架構&#xff0c;以其簡單易學、靈活性強、安全性高和強大的社區支持而廣受開發者喜愛。以下是對Laravel框架的詳細解析及使用方法&#xff1a; 一、Laravel框架簡介 1…

刷題——在二叉樹中找到最近公共祖先

在二叉樹中找到兩個節點的最近公共祖先_牛客題霸_牛客網 int lowestCommonAncestor(TreeNode* root, int o1, int o2) {if(root NULL) return -1;if((root->val o1) || (root->val o2)) return root->val;int left lowestCommonAncestor(root->left, o1, o2);i…

【pytorch19】交叉熵

分類問題的loss MSECross Entropy LossHinge Loss &#xff08;SVN用的比較多&#xff09; ∑ i m a x ( 0 , 1 ? y i ? h θ ( x i ) ) \sum_imax(0,1-y_i*h_\theta(x_i)) ∑i?max(0,1?yi??hθ?(xi?)) Entropy&#xff08;熵&#xff09; Uncertainty&#xff08;…

ESP32——物聯網小項目匯總

商品級ESP32智能手表 [文章鏈接] 用ESP32&#xff0c;做了個siri&#xff1f;&#xff01;開源了&#xff01; [文章鏈接]

IPsec連接 和 SSL連接

Psec和SSL連接是兩種用于保障網絡通信安全的技術 IPsec 通常用于連通兩個局域網&#xff0c;主要是網對網的連接&#xff0c;如分支機構與總部之間&#xff0c;或者本地IDC與云端VPC的子網連接。適合站點間的穩定通訊需求以及對網絡層安全有嚴格要求的場合。要求兩端有固定的網…

UDP協議:獨特之處及其在網絡通信中的應用

在網絡通信領域&#xff0c;UDP&#xff08;用戶數據報協議&#xff0c;User Datagram Protocol&#xff09;是一種廣泛使用的傳輸層協議。與TCP&#xff08;傳輸控制協議&#xff0c;Transmission Control Protocol&#xff09;相比&#xff0c;UDP具有其獨特的特點和適用場景…

對數據采集、數據存儲和數據處理流程

對數據采集、數據存儲和數據處理流程 數據采集是指從各種來源收集原始數據的過程&#xff0c;這通常包括傳感器、網站、社交媒體、API等。它涉及設置抓取工具、爬蟲技術或直接從數據庫獲取數據。數據存儲則涉及到將采集到的數據安全、高效地保存起來&#xff0c;常見的有關系型…

EDEM-FLUENT耦合報錯幾大原因總結(持續更新)

寫在前面,本篇內容主要是來源于自己做仿真時的個人總結,以及付費請教專業老師。每個人由于工況不一樣,所以報錯原因千奇百怪,不能一概而論,本篇內容主要是為本專欄讀者在報錯時提供大致的糾錯方向,從而達到少走彎路的效果,debug的過程需要大家一點點試算。問題解答在文 …

02STM32環境搭建新建工程

STM32環境搭建&新建工程 軟件安裝&#xff1a;開發方式&新建工程步驟&架構 個人心得 軟件安裝&#xff1a; 安裝Keil5 MDK 安裝器件支持包 軟件注冊 安裝STLINK驅動 安裝USB轉串口驅動 開發方式&新建工程步驟&架構 STM32開發方式&#xff1a; 1.寄存器 …

什么是倒退型自閉癥?

在星貝育園自閉癥兒童康復學校&#xff0c;作為一位致力于自閉癥兒童教育與康復的老師&#xff0c;我深知家長們面對“倒退型自閉癥”這一概念時的困惑與憂慮。今天&#xff0c;就讓我以專業的身份&#xff0c;為大家揭開倒退型自閉癥的神秘面紗&#xff0c;共同探討這一特殊現…

mysql中的遞歸函數recursive

遞歸部門 WITH recursive dept_tree AS (SELECTsd.mine_id AS mine_id,sd.dept_id AS dept_id,sd.tenant_id AS tenant_id,sd.order_num,sd.dept_name AS topName,sd.dept_id AS topIdFROMsys_dept sdWHERE<!-- 加上or后也會查詢出dept節點 sd.parent_id #{deptId} or sd.…

uniapp H5頁面設置跨域請求

記錄一下本地服務在uniapp H5頁面訪問請求報跨域的錯誤 這是我在本地起的服務端口號為8088 ip大家可打開cmd 輸入ipconfig 查看 第一種方法 在源碼視圖中配置 "devServer": {"https": false, // 是否啟用 https 協議&#xff0c;默認false"port&q…

跨界客戶服務:拓展服務邊界,創造更多價值

在當今這個日新月異的商業時代&#xff0c;跨界合作已不再是新鮮詞匯&#xff0c;它如同一股強勁的東風&#xff0c;吹散了行業間的壁壘&#xff0c;為企業服務創新開辟了前所未有的廣闊天地。特別是在客戶服務領域&#xff0c;跨界合作正以前所未有的深度和廣度&#xff0c;拓…

一文理解 Treelite,Treelite 為決策樹集成模型的部署和推理提供了高效、靈活的解決方案

&#x1f349; CSDN 葉庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、什么是 Treelite&#xff1f; Treelite 是一個專門用于將決策樹集成模型高效部署到生產環境中的機器學習模型編譯器&#xff0c;特別適合處理大批量數據的推理任務&#xff0c;能夠顯著提升推理性能…

[Vite]Vite插件生命周期了解

[Vite]Vite插件生命周期了解 Chunk和Bundle的概念 Chunk&#xff1a; 在 Vite 中&#xff0c;chunk 通常指的是應用程序中的一個代碼片段&#xff0c;它是通過 Rollup 或其他打包工具在構建過程中生成的。每個 chunk 通常包含應用程序的一部分邏輯&#xff0c;可能是一個路由視…

【刷題匯總--大數加法、 鏈表相加(二)、大數乘法】

C日常刷題積累 今日刷題匯總 - day0061、大數加法1.1、題目1.2、思路1.3、程序實現 2、 鏈表相加(二)2.1、題目2.2、思路2.3、程序實現 3、大數乘法3.1、題目3.2、思路3.3、程序實現 4、題目鏈接 今日刷題匯總 - day006 1、大數加法 1.1、題目 1.2、思路 讀完題,明白大數相加…

使用空指針訪問成員函數

#include<iostream> #include<ctime> using namespace std; class Person { public:void outPr(){cout << "outPr()被調用" << endl;} };void test02() {Person* p1 NULL;p1->outPr(); }int main() {test02();return 0; }