白騎士的C語言教學高級篇 3.4 C語言中的算法

????????算法是解決問題的核心。無論是排序、搜索,還是遞歸與動態規劃,算法的選擇和實現對程序的效率和性能有著重要影響。本節將介紹幾種常見的算法,包括排序算法、搜索算法,以及遞歸和動態規劃的應用。

排序算法

????????排序算法是將一組數據按特定順序排列的過程。常見的排序算法有冒泡排序、選擇排序、插入排序、快速排序和歸并排序等。下面是幾種常見排序算法的介紹和示例代碼。

冒泡排序

????????冒泡排序通過多次遍歷數組,每次比較相鄰的元素,如果順序錯誤就交換,直到整個數組有序,例如:

#include <stdio.h>void bubbleSort(int arr[], int n) {for (int i = 0; i < n-1; i++) {for (int j = 0; j < n-i-1; j++) {if (arr[j] > arr[j+1]) {// 交換arr[j]和arr[j+1]int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}
}int main() {int arr[] = {64, 34, 25, 12, 22, 11, 90};int n = sizeof(arr)/sizeof(arr[0]);bubbleSort(arr, n);printf("排序后的數組: ");for (int i = 0; i < n; i++)printf("%d ", arr[i]);return 0;
}

選擇排序

????????選擇排序每次從未排序部分中選出最小(或最大)的元素,放到已排序部分的末尾,例如:

#include <stdio.h>void selectionSort(int arr[], int n) {for (int i = 0; i < n-1; i++) {int minIndex = i;for (int j = i+1; j < n; j++) {if (arr[j] < arr[minIndex])minIndex = j;}int temp = arr[minIndex];arr[minIndex] = arr[i];arr[i] = temp;}
}int main() {int arr[] = {64, 25, 12, 22, 11};int n = sizeof(arr)/sizeof(arr[0]);selectionSort(arr, n);printf("排序后的數組: ");for (int i = 0; i < n; i++)printf("%d ", arr[i]);return 0;
}

快速排序

????????快速排序通過選擇一個基準元素,將數組分成兩部分,一部分所有元素比基準元素小,另一部分所有元素比基準元素大,然后遞歸地對這兩部分進行排序,例如:

#include <stdio.h>void swap(int* a, int* b) {int t = *a;*a = *b;*b = t;
}int partition (int arr[], int low, int high) {int pivot = arr[high];int i = (low - 1);for (int j = low; j <= high-1; j++) {if (arr[j] < pivot) {i++;swap(&arr[i], &arr[j]);}}swap(&arr[i + 1], &arr[high]);return (i + 1);
}void quickSort(int arr[], int low, int high) {if (low < high) {int pi = partition(arr, low, high);quickSort(arr, low, pi - 1);quickSort(arr, pi + 1, high);}
}int main() {int arr[] = {10, 7, 8, 9, 1, 5};int n = sizeof(arr)/sizeof(arr[0]);quickSort(arr, 0, n-1);printf("排序后的數組: ");for (int i = 0; i < n; i++)printf("%d ", arr[i]);return 0;
}

搜索算法

????????搜索算法用于在數據集合中查找特定元素。常見的搜索算法有線性搜索和二分搜索。

線性搜索

????????線性搜索逐一比較數據集合中的每個元素,直到找到目標元素或搜索完所有元素,例如:

#include <stdio.h>int linearSearch(int arr[], int n, int x) {for (int i = 0; i < n; i++) {if (arr[i] == x)return i;}return -1;
}int main() {int arr[] = {2, 3, 4, 10, 40};int x = 10;int n = sizeof(arr)/sizeof(arr[0]);int result = linearSearch(arr, n, x);if(result == -1)printf("元素不在數組中\n");elseprintf("元素在數組中的索引: %d\n", result);return 0;
}

二分搜索

????????二分搜索在有序數組中查找目標元素,通過反復將搜索范圍縮小為一半,直到找到目標元素或搜索范圍為空,例如:

#include <stdio.h>int binarySearch(int arr[], int l, int r, int x) {while (l <= r) {int m = l + (r - l) / 2;if (arr[m] == x)return m;if (arr[m] < x)l = m + 1;elser = m - 1;}return -1;
}int main() {int arr[] = {2, 3, 4, 10, 40};int x = 10;int n = sizeof(arr)/sizeof(arr[0]);int result = binarySearch(arr, 0, n-1, x);if(result == -1)printf("元素不在數組中\n");elseprintf("元素在數組中的索引: %d\n", result);return 0;
}

遞歸與動態規劃

遞歸

????????是指一個函數調用其自身。遞歸算法通常用于解決分治問題,例如斐波那契數列和階乘,例如:

#include <stdio.h>int fibonacci(int n) {if (n <= 1)return n;return fibonacci(n - 1) + fibonacci(n - 2);
}int main() {int n = 9;printf("Fibonacci數列的第%d項是: %d\n", n, fibonacci(n));return 0;
}

動態規劃

????????是一種將復雜問題分解為更小子問題的技術,通過記憶化或表格化存儲子問題的結果,避免重復計算,提升算法效率,例如:

#include <stdio.h>int fibonacci(int n) {int f[n+1];f[0] = 0;f[1] = 1;for (int i = 2; i <= n; i++) {f[i] = f[i-1] + f[i-2];}return f[n];
}int main() {int n = 9;printf("Fibonacci數列的第%d項是: %d\n", n, fibonacci(n));return 0;
}

總結

????????排序算法、搜索算法以及遞歸與動態規劃是C語言編程中不可或缺的重要部分。通過掌握這些算法,將能夠高效地處理和操作數據,解決復雜的編程問題。學習和理解這些基礎算法,不僅有助于提升編程能力,也為解決實際問題打下堅實的基礎。

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

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

相關文章

昇思25天學習打卡營第17天|SSD目標檢測

學AI還能贏獎品&#xff1f;每天30分鐘&#xff0c;25天打通AI任督二脈 (qq.com) SSD目標檢測 模型簡介 SSD&#xff0c;全稱Single Shot MultiBox Detector&#xff0c;是Wei Liu在ECCV 2016上提出的一種目標檢測算法。使用Nvidia Titan X在VOC 2007測試集上&#xff0c;SSD…

使用 CloudWatch + SNS + Lambda 實現多渠道告警系統

1. 簡介 在現代云計算環境中,及時和有效的監控告警對于維護系統的穩定性至關重要。本文將介紹如何使用 AWS CloudWatch、Simple Notification Service (SNS) 和 Lambda 函數構建一個多渠道告警系統,包括郵件告警、釘釘機器人告警和電話語音告警。 2. 系統架構 整個系統的工…

利用border繪制三角技巧

繪制三角形的效果如圖 <html lang"zh-cn"> <head><meta charset"UTF-8"><title>demo</title><style>* {margin: 0;padding: 0;}.box {/* 盒子寬高改成零就變成三角形 &#xff0c;需要哪個方向的三角形就設置哪個方向…

Python一些可能用的到的函數系列130 UCS-Time Brick

說明 UCS對象是基于GFGoLite進行封裝&#xff0c;且側重于實現UCS規范。 內容 1 函數 我發現pydantic真是一個特別好用的東西&#xff0c;可以確保在數據傳遞時的可靠&#xff0c;以及對某個數據模型的描述。 以下&#xff0c;UCS給出了id、time相關的brick映射&#xff0…

【分布式系統五】監控平臺Zabbix實際監控運用(命令+截圖詳細版)

目錄 一.Zabbix 監控 Windows 1.安裝zabbix 2.Web 頁面添加主機&#xff0c;關聯模板 二.Zabbix 監控 Java 應用 1.安裝tomcat 2.服務端安裝 zabbix-java-gateway 3.Web 頁面添加主機&#xff0c;關聯模板 三.Zabbix 監控 SNMP 1.服務端安裝 snmp 監控程序 2.修改 sn…

RT-Thread和freeRTOS啟動流程

一. freeRTOS啟動流程 二. RT-Thread啟動流程 因為RT-Thread中我們定義了補丁函數也叫做鉤子函數--$Sub$$main()--作為一個新功能函數&#xff0c;可以將原有函數劫持下來&#xff0c;并在之后的程序運行中加上$Super $ $前綴來重新調用原始函數。 所以啟動流程是$Sub$$main(…

Chiasmodon:一款針對域名安全的公開資源情報OSINT工具

關于Chiasmodon Chiasmodon是一款針對域名安全的公開資源情報OSINT工具&#xff0c;該工具可以幫助廣大研究人員從各種來源收集目標域名的相關信息&#xff0c;并根據域名、Google Play應用程序、電子郵件地址、IP地址、組織和URL等信息進行有針對性的數據收集。 該工具可以提…

利用node連接mongodb實現一個小型后端服務系統demo

http 請求 實現get請求數據庫數據&#xff1b;實現添加數據實現編輯數據實現刪除數據實現導出txt文件、Excel文件實現查詢數據庫數據并利用導出為excel文件 node 版本 16.16.0 node 版本 18.16.0 會連接 MongoDB 數據庫錯誤。 Connected to MongoDB failed MongoServerSele…

Nginx-簡介

介紹 nginx是一款HTTP和反向代理服務器、郵件代理服務器和通用TCP/IP代理服務器&#xff0c;在俄羅斯廣泛使用&#xff0c;用于代理高負載站點。 版本 nginx開源版nginx plus企業版openresty將nginx和lua腳本結合 tengine更穩定、高性能 正向代理 客戶端和代理服務是一伙的…

【vue動態組件】VUE使用component :is 實現在多個組件間來回切換

VUE使用component :is 實現在多個組件間來回切換 component :is 動態父子組件傳值 相關代碼實現&#xff1a; <component:is"vuecomponent"></component>import componentA from xxx; import componentB from xxx; import componentC from xxx;switch(…

生產力工具|viso常用常見科學素材包

一、科學插圖素材網站 一圖勝千言&#xff0c;想要使自己的論文或重要匯報更加引人入勝&#xff1f;不妨考慮利用各類示意圖和科學插圖來輔助研究工作。特別是對于新手或者繁忙的科研人員而言&#xff0c;利用免費的在線科學插圖素材庫&#xff0c;能夠極大地節省時間和精力。 …

Python字符編碼檢測利器: chardet庫詳解

Python字符編碼檢測利器: chardet庫詳解 1. chardet簡介2. 安裝3. 基本使用3.1 檢測字符串編碼3.2 檢測文件編碼 4. 高級功能4.1 使用UniversalDetector4.2 自定義編碼檢測 5. 實際應用示例5.1 批量處理文件編碼5.2 自動轉換文件編碼 6. 性能優化7. 注意事項和局限性8. 總結 在…

【代碼隨想錄】【算法訓練營】【第58天】 [卡碼110]字符串接龍 [卡碼105]有向圖的完全可達性 [卡碼106]島嶼的周長

前言 思路及算法思維&#xff0c;指路 代碼隨想錄。 題目來自 卡碼網。 day 59&#xff0c;周五&#xff0c;繼續ding~ 題目詳情 [卡碼110] 字符串接龍 題目描述 卡碼110 字符串接龍 解題思路 前提&#xff1a; 思路&#xff1a; 重點&#xff1a; 代碼實現 C語言 […

Jackson庫使用教程

1. Jackson概述 定義: Jackson是一個基于Java的開源JSON解析工具&#xff0c;用于Java對象與JSON數據的互相轉換。示例JSON:{"author": "一路向北_Coding","age": 20,"hobbies": ["coding", "leetcode", "r…

昇思25天學習打卡營第13天|linchenfengxue

Diffusion擴散模型 關于擴散模型&#xff08;Diffusion Models&#xff09;有很多種理解&#xff0c;本文的介紹是基于denoising diffusion probabilistic model &#xff08;DDPM&#xff09;&#xff0c;DDPM已經在&#xff08;無&#xff09;條件圖像/音頻/視頻生成領域取得…

小蜜蜂WMS與小蜜蜂WMS對接集成根據條件獲取客戶信息列表(分頁)連通新增客戶信息(小蜜蜂讀寫測試)

小蜜蜂WMS與小蜜蜂WMS對接集成根據條件獲取客戶信息列表&#xff08;分頁&#xff09;連通新增客戶信息(小蜜蜂讀寫測試) 接通系統&#xff1a;小蜜蜂WMS 天津市小蜜蜂計算機技術有限公司&#xff08;acbee&#xff0c;TianJinACBEEComputerTechnologyCo.,Ltd&#xff09;成立于…

基于圖像處理的滑塊驗證碼匹配技術

滑塊驗證碼是一種常見的驗證碼形式&#xff0c;通過拖動滑塊與背景圖像中的缺口進行匹配&#xff0c;驗證用戶是否為真人。本文將詳細介紹基于圖像處理的滑塊驗證碼匹配技術&#xff0c;并提供優化代碼以提高滑塊位置偏移量的準確度&#xff0c;尤其是在背景圖滑塊陰影較淺的情…

上海市計算機學會競賽平臺2023年2月月賽丙組平分數字(一)

題目描述 給定 &#x1d45b;n 個整數&#xff1a;&#x1d44e;1,&#x1d44e;2,??,&#x1d44e;&#x1d45b;a1?,a2?,?,an?&#xff0c;請判定能否將它們分成兩個部分&#xff08;不得丟棄任何數字&#xff09;&#xff0c;每部分的數字之和一樣大。 輸入格式 第…

模擬,CF 570C - Replacement

一、題目 1、題目描述 2、輸入輸出 2.1輸入 2.2輸出 3、原題鏈接 570C - Replacement 二、解題報告 1、思路分析 1、長為cnt的連續串的最小操作次數為cnt - 1 2、每次將一個非. 替換為. f要么增加1要么增加2 只有前后都是 . 的時候會增加2 同理&#xff0c;當我們將一…

STM32外擴SRAM及用法

一.概述 一般單片機有片內的RAM&#xff0c;但都不多&#xff0c;比如&#xff1a;STM32F407ZGT6 自帶了 192K 字節的 RAM&#xff0c;對一般應用來說&#xff0c;已經足夠了&#xff0c;不過在一些對內存要求高的場合&#xff0c;比如做華麗效果的 GUI&#xff0c;處理大量數據…