那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32采集傳感器數(shù)據(jù)通過冒泡排序取穩(wěn)定值

DS小龍哥-嵌入式技術(shù) ? 來(lái)源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2023-05-25 14:14 ? 次閱讀

一、前言

物聯(lián)網(wǎng)單片機(jī)開發(fā)中,經(jīng)常需要采集各種傳感器的數(shù)據(jù)。比如:溫度、濕度、MQ2、MQ3、MQ4等等傳感器數(shù)據(jù)。這些數(shù)據(jù)采集過程中可能有波動(dòng),偶爾不穩(wěn)定,為了得到穩(wěn)定的值,我們可以對(duì)數(shù)據(jù)多次采集,進(jìn)行排序,去掉最大和最小的值,然后取平均值返回。

image-20230525140855726

image-20230525140932125

二、排序算法

【1】冒泡排序

冒泡排序(Bubble Sort)是一種簡(jiǎn)單的排序算法,也是最基礎(chǔ)、最容易理解的一種排序算法。它會(huì)遍歷要排序的數(shù)組,依次比較相鄰兩個(gè)元素的大小,如果前一個(gè)元素比后一個(gè)元素大,就交換這兩個(gè)元素的位置。

冒泡排序的過程如下:

  1. 從數(shù)組的第一個(gè)元素開始,依次比較相鄰的兩個(gè)元素,如果前一個(gè)元素比后一個(gè)元素大,則交換這兩個(gè)元素的位置。
  2. 繼續(xù)比較相鄰的元素,直到數(shù)組的最后一個(gè)元素。
  3. 重復(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)位置,使得插入后仍然有序。

插入排序的過程如下:

  1. 假設(shè)第一個(gè)元素已經(jīng)是排好序的序列,從第二個(gè)元素開始,依次將每個(gè)元素插入到已經(jīng)排好序的序列中。
  2. 每次從未排序的部分中取出一個(gè)元素,與已排序的序列中的元素從后向前依次比較,找到插入的位置,即找到一個(gè)比當(dāng)前元素小的值或者已經(jīng)到了開頭位置。
  3. 將當(dāng)前元素插入到已排序序列的合適位置上,重新調(diào)整已排序的序列,繼續(xù)對(duì)未排序的序列進(jìn)行排序。
  4. 重復(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)行一次插入排序。

希爾排序的過程如下:

  1. 選擇一個(gè)增量序列,將待排序的數(shù)組按照這個(gè)增量序列分成若干組(子序列)。通常,在第一次排序時(shí),增量取數(shù)組長(zhǎng)度的一半,以后每次將增量減半,直到增量為1。
  2. 對(duì)每個(gè)子序列進(jìn)行插入排序,即將每個(gè)子序列中的元素按照遞增的順序插入到已排序好的序列中。
  3. 重復(fù)執(zhí)行步驟2,改變?cè)隽浚钡皆隽繛?。
  4. 最后再對(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)樗谂判蜻^程中只需要常數(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ì)算得到的平均值。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 傳感器
    +關(guān)注

    關(guān)注

    2553

    文章

    51407

    瀏覽量

    756638
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6043

    文章

    44621

    瀏覽量

    638616
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7145

    瀏覽量

    89585
  • 物聯(lián)網(wǎng)
    +關(guān)注

    關(guān)注

    2914

    文章

    44939

    瀏覽量

    377084
  • STM32
    +關(guān)注

    關(guān)注

    2272

    文章

    10924

    瀏覽量

    357599
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    FPGA排序-冒泡排序介紹

    排序算法是圖像處理中經(jīng)常使用一種算法,常見的排序算法有插入排序、希爾排序、選擇排序冒泡
    發(fā)表于 07-17 10:12 ?1149次閱讀
    FPGA<b class='flag-5'>排序</b>-<b class='flag-5'>冒泡</b><b class='flag-5'>排序</b>介紹

    labview 版的冒泡排序

    labview 版的冒泡排序,只是想用Labview表達(dá)冒泡法的思想,
    發(fā)表于 06-05 11:18

    冒泡排序

    package algorithms// 冒泡排序// 冒泡排序算法的運(yùn)作如下:// 比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)。// 對(duì)每一對(duì)相鄰元素作同樣的工作,從開始第
    發(fā)表于 10-17 19:03

    常用排序法之一 ——冒泡排序法和選擇排序

    的就是,每一次循環(huán)過程中,通過比較選擇出你需要的**最**。選擇排序法的過程是,通**過比較,選擇出每一輪中最元素,然后把他和這一輪中最最前面的元素交換**,所以這個(gè)算法關(guān)鍵是要記
    發(fā)表于 11-01 12:25

    嵌入式stm32實(shí)用的排序算法 - 交換排序

    Ⅰ、寫在前面前面寫了關(guān)于ADC采集電壓的文章,大家除了求平均的方式來(lái)處理采樣,還有沒有使用到其他的方式來(lái)處理采集呢?在某些情況下就需要對(duì)一組數(shù)據(jù)
    發(fā)表于 04-12 13:14

    Java冒泡排序的原理是什么?

    Java冒泡排序的原理
    發(fā)表于 11-06 07:12

    冒泡排序法的具體實(shí)現(xiàn)方法是什么?

    什么是冒泡排序冒泡排序法的具體實(shí)現(xiàn)方法是什么?
    發(fā)表于 07-15 06:48

    基于STM32單片機(jī)水質(zhì)檢測(cè)PH檢測(cè)采集傳感器模塊設(shè)計(jì)資料分享

    系統(tǒng)功能設(shè)計(jì)(末尾附文件)本系統(tǒng)由STM32單片機(jī)核心板、超聲波測(cè)距模塊、PH傳感器模塊、電導(dǎo)率傳感器、LCD1602液晶及電源組成。1、超聲波
    發(fā)表于 02-21 06:01

    一文了解冒泡排序

    冒泡排序是一種交換排序。 什么是交換排序呢? 交換排序:兩兩比較待排序的關(guān)鍵字,并交
    的頭像 發(fā)表于 01-17 12:47 ?3080次閱讀
    一文了解<b class='flag-5'>冒泡</b><b class='flag-5'>排序</b>

    揭秘冒泡排序、交換排序和插入排序

    01 — 冒泡排序 在實(shí)現(xiàn)冒泡排序代碼之前我們先理解一下什么是冒泡排序,我們舉一個(gè)現(xiàn)實(shí)生活中的例
    的頭像 發(fā)表于 06-18 09:57 ?1580次閱讀

    C語(yǔ)言冒泡排序工程代碼匯總

    C語(yǔ)言冒泡排序工程代碼匯總
    發(fā)表于 08-30 11:06 ?3次下載

    冒泡排序的基本思想

    冒泡排序的英文Bubble Sort,是一種最基礎(chǔ)的交換排序。之所以叫做冒泡排序,因?yàn)槊恳粋€(gè)元素都可以像小氣泡一樣,根據(jù)自身大小一點(diǎn)一點(diǎn)向數(shù)
    的頭像 發(fā)表于 01-20 11:38 ?5958次閱讀
    <b class='flag-5'>冒泡</b><b class='flag-5'>排序</b>的基本思想

    php版冒泡排序是如何實(shí)現(xiàn)的?

    無(wú)論學(xué)習(xí)哪一種編程語(yǔ)言,進(jìn)行算法方面的訓(xùn)練時(shí)都繞不開“排序”。排序在進(jìn)階編程中有非常廣泛的應(yīng)用,要想成為編程高手,排序算法是必須要掌握的。而冒泡排序
    的頭像 發(fā)表于 01-20 10:39 ?985次閱讀
    php版<b class='flag-5'>冒泡</b><b class='flag-5'>排序</b>是如何實(shí)現(xiàn)的?

    怎樣運(yùn)用Java實(shí)現(xiàn)冒泡排序和Arrays排序出來(lái)

    數(shù)據(jù)結(jié)構(gòu)中我們學(xué)習(xí)了解了冒泡排序和Arrays排序的基本算法,但沒能夠用編程語(yǔ)言實(shí)現(xiàn)出來(lái)。那我們應(yīng)該怎樣運(yùn)用Java通過編程語(yǔ)言將
    的頭像 發(fā)表于 03-02 09:37 ?544次閱讀
    怎樣運(yùn)用Java實(shí)現(xiàn)<b class='flag-5'>冒泡</b><b class='flag-5'>排序</b>和Arrays<b class='flag-5'>排序</b>出來(lái)

    jwt冒泡排序的原理

    jwt簡(jiǎn)介 冒泡排序: (Bubble Sort)是一種簡(jiǎn)單的交換排序。之所以叫做冒泡排序,因?yàn)槲覀兛梢园衙總€(gè)元素當(dāng)成一個(gè)小氣泡,根據(jù)氣泡大
    的頭像 發(fā)表于 09-25 16:33 ?580次閱讀
    jwt<b class='flag-5'>冒泡</b><b class='flag-5'>排序</b>的原理
    免费百家乐官网追号工具| 大发888方官下载| 伟博百家乐官网娱乐城| 网上百家乐官网注册彩金| 顶级赌场连环夺宝下载| 百家乐平注常赢玩法技巧| 百家乐币| 百家乐翻天快播| 百家乐怎样发牌| 澳门玩百家乐官网00| 百家乐官网押注最高是多少| 正品百家乐官网游戏| 百家乐官网赌场占多大概率| 百家乐官网赌的技巧| 临漳县| 莆田棋牌迷| bet365官方网址| 娱乐城注册送18| 万豪国际开户| 网上合法赌博网站| 唐河县| 东方市| 百家乐官网路单资料| 鸡泽县| 百家乐官网百家乐官网视频| 百家乐官网必学技巧| 最好的百家乐官网好评平台都有哪些| 百家乐真人荷官网| 澳门百家乐路单| 豪华百家乐桌子| 博狗百家乐官网的玩法技巧和规则| 百家乐从哪而来| 百家乐台布哪里有卖| 水果机遥控| 沈阳盛京棋牌下载| 豪博娱乐城| 百家乐官网桌子北京| 百家乐官网娱乐网77scs| 百家乐官网筹码套装100片| 真人百家乐输钱惨了| 百家乐现金网最好的系统哪里有可靠吗|