一、前言
在物聯(lián)網(wǎng)、單片機(jī)開(kāi)發(fā)中,經(jīng)常需要采集各種傳感器的數(shù)據(jù)。比如:溫度、濕度、MQ2、MQ3、MQ4等等傳感器數(shù)據(jù)。這些數(shù)據(jù)采集過(guò)程中可能有波動(dòng),偶爾不穩(wěn)定,為了得到穩(wěn)定的值,我們可以對(duì)數(shù)據(jù)多次采集,進(jìn)行排序,去掉最大和最小的值,然后取平均值返回。
二、排序算法
【1】冒泡排序
冒泡排序(Bubble Sort)是一種簡(jiǎn)單的排序算法,也是最基礎(chǔ)、最容易理解的一種排序算法。它會(huì)遍歷要排序的數(shù)組,依次比較相鄰兩個(gè)元素的大小,如果前一個(gè)元素比后一個(gè)元素大,就交換這兩個(gè)元素的位置。
冒泡排序的過(guò)程如下:
從數(shù)組的第一個(gè)元素開(kāi)始,依次比較相鄰的兩個(gè)元素,如果前一個(gè)元素比后一個(gè)元素大,則交換這兩個(gè)元素的位置。
繼續(xù)比較相鄰的元素,直到數(shù)組的最后一個(gè)元素。
重復(fù)執(zhí)行步驟1和步驟2,直到整個(gè)數(shù)組都按照從小到大的順序排列好。
冒泡排序的時(shí)間復(fù)雜度是O(N^2),其中N是數(shù)組中元素的數(shù)量。在實(shí)際應(yīng)用中,由于其時(shí)間復(fù)雜度較高,冒泡排序很少被用于大規(guī)模數(shù)據(jù)的排序,但它仍然是一種優(yōu)秀的教學(xué)工具,因?yàn)樗菀桌斫夂蛯?shí)現(xiàn),并且可以幫助初學(xué)者理解排序算法的基本思想。
以下是C語(yǔ)言代碼的實(shí)現(xiàn),封裝為名為calculateAverage的函數(shù)。
#define ARRAY_SIZE 20
// 冒泡排序算法函數(shù)
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]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
// 計(jì)算平均值函數(shù),去除最大值和最小值
int calculateAverage() {
int arr[ARRAY_SIZE];
// 連續(xù)讀取20次數(shù)據(jù)
for(int i = 0; i < ARRAY_SIZE; i++) {
arr[i] = ReadADC();
}
// 對(duì)數(shù)組進(jìn)行排序
bubbleSort(arr, ARRAY_SIZE);
// 去掉最大值和最小值
int sum = 0;
for(int i = 1; i < ARRAY_SIZE-1; i++) {
sum += arr[i];
}
// 計(jì)算平均值并返回
return sum / (ARRAY_SIZE-2);
}
在函數(shù)中,首先定義了一個(gè)常量ARRAY_SIZE表示需要讀取的數(shù)據(jù)的數(shù)量。然后,使用一個(gè)循環(huán)讀取20次數(shù)據(jù),并將它們存儲(chǔ)到一個(gè)數(shù)組中。接著,用冒泡排序算法對(duì)數(shù)組進(jìn)行排序。在排序完成后,計(jì)算數(shù)組中除去最大值和最小值的元素之和,并計(jì)算平均值。最后,返回計(jì)算得到的平均值。
【2】插入排序
插入排序(Insertion Sort)是一種簡(jiǎn)單直觀的排序算法,它的基本思想是將一個(gè)元素插入到已排序好的序列中的適當(dāng)位置,使得插入后仍然有序。
插入排序的過(guò)程如下:
假設(shè)第一個(gè)元素已經(jīng)是排好序的序列,從第二個(gè)元素開(kāi)始,依次將每個(gè)元素插入到已經(jīng)排好序的序列中。
每次從未排序的部分中取出一個(gè)元素,與已排序的序列中的元素從后向前依次比較,找到插入的位置,即找到一個(gè)比當(dāng)前元素小的值或者已經(jīng)到了開(kāi)頭位置。
將當(dāng)前元素插入到已排序序列的合適位置上,重新調(diào)整已排序的序列,繼續(xù)對(duì)未排序的序列進(jìn)行排序。
重復(fù)執(zhí)行步驟2和步驟3,直到整個(gè)數(shù)組都按照從小到大的順序排列好。
插入排序的時(shí)間復(fù)雜度是O(N^2),其中N是數(shù)組中元素的數(shù)量。在實(shí)際應(yīng)用中,插入排序通常適用于處理小規(guī)模數(shù)據(jù)或者已經(jīng)接近有序的數(shù)據(jù),因?yàn)榇藭r(shí)插入排序的效率高于其他排序算法。
以下是C語(yǔ)言代碼的實(shí)現(xiàn),封裝為名為calculateAverage的函數(shù)。
#define ARRAY_SIZE 20
// 插入排序算法函數(shù)
void insertionSort(int arr[], int n) {
for(int i = 1; i < n; i++) {
int key = arr[i];
int j = i-1;
while(j >= 0 && arr[j] > key) {
arr[j+1] = arr[j];
j--;
}
arr[j+1] = key;
}
}
// 計(jì)算平均值函數(shù),去除最大值和最小值
int calculateAverage() {
int arr[ARRAY_SIZE];
// 連續(xù)讀取20次數(shù)據(jù)
for(int i = 0; i < ARRAY_SIZE; i++) {
arr[i] = ReadADC();
}
// 對(duì)數(shù)組進(jìn)行排序
insertionSort(arr, ARRAY_SIZE);
// 去掉最大值和最小值
int sum = 0;
for(int i = 1; i < ARRAY_SIZE-1; i++) {
sum += arr[i];
}
// 計(jì)算平均值并返回
return sum / (ARRAY_SIZE-2);
}
在函數(shù)中,首先定義了一個(gè)常量ARRAY_SIZE表示需要讀取的數(shù)據(jù)的數(shù)量。然后,使用一個(gè)循環(huán)讀取20次數(shù)據(jù),并將它們存儲(chǔ)到一個(gè)數(shù)組中。接著,用插入排序算法對(duì)數(shù)組進(jìn)行排序。在排序完成后,計(jì)算數(shù)組中除去最大值和最小值的元素之和,并計(jì)算平均值。最后,返回計(jì)算得到的平均值。
【3】希爾排序
希爾排序(Shell Sort)是一種由Donald Shell在1959年發(fā)明的排序算法,它是插入排序的一種變體,旨在減少排序中元素的移動(dòng)次數(shù),從而使算法更快。希爾排序的基本思想是把數(shù)組中相距某個(gè)“增量”的元素組成一個(gè)子序列,對(duì)每個(gè)子序列進(jìn)行插入排序,然后逐步縮小增量,重復(fù)進(jìn)行上述操作,直到增量為1,最后再對(duì)整個(gè)數(shù)組進(jìn)行一次插入排序。
希爾排序的過(guò)程如下:
選擇一個(gè)增量序列,將待排序的數(shù)組按照這個(gè)增量序列分成若干組(子序列)。通常,在第一次排序時(shí),增量取數(shù)組長(zhǎng)度的一半,以后每次將增量減半,直到增量為1。
對(duì)每個(gè)子序列進(jìn)行插入排序,即將每個(gè)子序列中的元素按照遞增的順序插入到已排序好的序列中。
重復(fù)執(zhí)行步驟2,改變?cè)隽浚钡皆隽繛?。
最后再對(duì)整個(gè)數(shù)組進(jìn)行插入排序。
希爾排序的時(shí)間復(fù)雜度與所選取的增量序列有關(guān)。最壞情況下的時(shí)間復(fù)雜度為O(N^2),其中N是數(shù)組中元素的數(shù)量。但在大多數(shù)情況下,希爾排序的時(shí)間復(fù)雜度優(yōu)于O(N^2),可以達(dá)到O(N log N)的級(jí)別。希爾排序的空間復(fù)雜度為O(1),因?yàn)樗谂判蜻^(guò)程中只需要常數(shù)個(gè)額外的存儲(chǔ)空間。
以下是C語(yǔ)言代碼實(shí)現(xiàn),封裝為名為calculateAverage的函數(shù)。
#define ARRAY_SIZE 20
// 希爾排序算法函數(shù)
void shellSort(int arr[], int n) {
for(int gap = n/2; gap > 0; gap /= 2) {
for(int i = gap; i < n; i++) {
int temp = arr[i];
int j;
for(j = i; j >= gap && arr[j-gap] > temp; j -= gap) {
arr[j] = arr[j-gap];
}
arr[j] = temp;
}
}
}
// 計(jì)算平均值函數(shù),去除最大值和最小值
int calculateAverage() {
int arr[ARRAY_SIZE];
// 連續(xù)讀取20次數(shù)據(jù)
for(int i = 0; i < ARRAY_SIZE; i++) {
arr[i] = ReadADC();
}
// 對(duì)數(shù)組進(jìn)行排序
shellSort(arr, ARRAY_SIZE);
// 去掉最大值和最小值
int sum = 0;
for(int i = 1; i < ARRAY_SIZE-1; i++) {
sum += arr[i];
}
// 計(jì)算平均值并返回
return sum / (ARRAY_SIZE-2);
}
在函數(shù)中,首先定義了一個(gè)常量ARRAY_SIZE表示需要讀取的數(shù)據(jù)的數(shù)量。然后,使用一個(gè)循環(huán)讀取20次數(shù)據(jù),并將它們存儲(chǔ)到一個(gè)數(shù)組中。接著,用希爾排序算法對(duì)數(shù)組進(jìn)行排序。在排序完成后,計(jì)算數(shù)組中除去最大值和最小值的元素之和,并計(jì)算平均值。最后,返回計(jì)算得到的平均值。
上一篇:深入解讀STM32啟動(dòng)詳細(xì)流程分析-上
下一篇:STM32+DHT11監(jiān)測(cè)環(huán)境的溫濕度
推薦閱讀最新更新時(shí)間:2025-04-23 12:29



設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- 英飛凌微控制器:以全新實(shí)惠套件和強(qiáng)大開(kāi)發(fā)環(huán)境為開(kāi)發(fā)者提供支持
- iTOP-i.MX6開(kāi)發(fā)板設(shè)備數(shù)驅(qū)動(dòng)Menuconfig的用法
- 迅為IMX6ULL開(kāi)發(fā)板Qt for Android搭建開(kāi)發(fā)環(huán)境
- 迅為i.MX8M mini開(kāi)發(fā)板Windots QT系統(tǒng)開(kāi)發(fā)環(huán)境搭建
- 迅為IMX8MM開(kāi)發(fā)板Yocto系統(tǒng)使用Gstarwmra(一)
- 迅為IMX8M mini開(kāi)發(fā)板Linix系統(tǒng)修改默認(rèn)屏幕
- iTOP-4412開(kāi)發(fā)板支持4G以上文件系統(tǒng)擴(kuò)展
- 迅為IMX8MM開(kāi)發(fā)板Yocto系統(tǒng)設(shè)置開(kāi)機(jī)自啟動(dòng)
- 迅為IMX6Q開(kāi)發(fā)板 Buildroot文件系統(tǒng)mqtt測(cè)試
- 基于小馬哥的四軸遙控器
- 【立創(chuàng)開(kāi)發(fā)板】九日梁山牌游戲機(jī)
- 使用 Semtech 的 SC1202 的參考設(shè)計(jì)
- 使用 Semtech 的 SC1630 的參考設(shè)計(jì)
- IS31FL3728-QFLS2-EB,基于 IS31FL3728 音頻調(diào)制矩陣 LED 驅(qū)動(dòng)器的評(píng)估板
- 410_USB_HUB_Pro(已驗(yàn)證)
- 使用 TC7106 ADC 提供單 +5V 電源的典型應(yīng)用
- SJA1110 100Base-T1多千兆以太網(wǎng)交換機(jī)示例板
- 青軸豬頭除塵器 讓電腦鍵盤(pán)干干凈凈
- 基于STM32的電子密碼鎖
- 法拉利新專利:新智能頭盔
- 阿里巴巴領(lǐng)投,元戎啟行獲得3億美元B輪融資
- 電池1037℃高溫都不爆炸不起火,長(zhǎng)城大禹電池技術(shù)發(fā)布
- ATmega16 ADC噪聲抑制模式
- 英特爾宣布將推動(dòng)Mobileye獨(dú)立上市
- 英飛凌攜手 MCI 為奧地利的學(xué)校提供空氣質(zhì)量檢測(cè)傳感器
- 英特爾Nick McKeown:5G的意義遠(yuǎn)超智能手機(jī)
- 51單片機(jī)的靜態(tài)和動(dòng)態(tài)數(shù)碼管的顯示
- 安立MS46322A矢量網(wǎng)絡(luò)測(cè)試儀可提高精度和測(cè)量重復(fù)性
- 單相電機(jī)倒順開(kāi)關(guān)接線方法_單相電機(jī)的電流計(jì)算公式
- Factorial 汽車尺寸固態(tài)電池 FEST 獲 Stellantis 聯(lián)合驗(yàn)證:375Wh/kg 能量密度
- 英特爾代工業(yè)務(wù)醞釀逆襲,18A 制程獲英偉達(dá)等巨頭青睞
- 今年車展,那些正在崛起的中國(guó)芯片
- 高通攜手中國(guó)“汽車朋友圈”亮相2025上海車展: 加速駕駛輔助普惠,推動(dòng)艙駕創(chuàng)新升級(jí)
- 工業(yè)市場(chǎng)正在快速回暖,德州儀器如何重塑電力電子市場(chǎng)?
- 特斯拉:美國(guó)交付的Model Y/3電池包已實(shí)現(xiàn)100%美國(guó)生產(chǎn)
- 地平線與博世深化合作,攜手為多家車企提供輔助駕駛產(chǎn)品
- 強(qiáng)化中國(guó)市場(chǎng)戰(zhàn)略布局,德州儀器正靈活應(yīng)對(duì)全球關(guān)稅挑戰(zhàn)
- Molex莫仕通過(guò)本地合作和創(chuàng)新加強(qiáng)支持中國(guó)汽車行業(yè)
- 貿(mào)澤開(kāi)售Texas Instruments適用于高分辨率AR HUD的 全新DLP4620S-Q1 0.46"汽車數(shù)字微鏡器件
- 艾睿電子技術(shù)解決方案展 2024 — 攜手共建更智能綠色未來(lái),火熱報(bào)名中!
- 安森美半導(dǎo)體移動(dòng)與可穿戴設(shè)備解決方案下載有禮!
- 智能家居當(dāng)下趨勢(shì)與挑戰(zhàn) 泰科電子助力連接舒適未來(lái)
- WEBENCH設(shè)計(jì)狂歡盛宴,輕松設(shè)計(jì)贏好禮!
- 福祿克首款熱成像萬(wàn)用表Fluke-279FC 即將上市!填寫(xiě)問(wèn)卷贏好禮嘍!
- MicroPython搶鮮玩 Python遇上MCU=? 由你定
- 【EE團(tuán)】超低價(jià)接近感應(yīng)傳感器開(kāi)發(fā)套件火爆開(kāi)團(tuán)!!!
- 下載嘍:PCIe要了解的10件事和識(shí)別協(xié)議的BSX系列BERTScope誤碼率測(cè)試儀技術(shù)資料
- 半導(dǎo)體激光產(chǎn)業(yè)發(fā)展空間較大 技術(shù)發(fā)展速度加快
- 從高山到平原:移動(dòng)AI下沉的關(guān)鍵節(jié)點(diǎn)
- 以太網(wǎng)和工業(yè)以太網(wǎng)之間有哪些不同?
- 無(wú)人駕駛未來(lái)去哪?場(chǎng)景是終極考驗(yàn)
- 白宮內(nèi)部報(bào)告,揭露美國(guó)打壓中國(guó)芯片行業(yè)內(nèi)幕
- 海口:支持發(fā)展專用芯片及集成電路設(shè)計(jì)等產(chǎn)業(yè)
- Vicor輻射容錯(cuò) DC-DC 轉(zhuǎn)換器電源模塊,具備抗單粒子干擾功能
- 突破傳統(tǒng)局限,利用新一代解決方案管理項(xiàng)目風(fēng)險(xiǎn)
- 電商、AI企業(yè)博弈,國(guó)內(nèi)物流機(jī)器人市場(chǎng)的戰(zhàn)火越燒越旺
- Waymo CEO:造輛無(wú)人駕駛汽車堪比造火箭