在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

STM32采集傳感器數據通過冒泡排序取穩定值

DS小龍哥-嵌入式技術 ? 來源:DS小龍哥-嵌入式技術 ? 作者:DS小龍哥-嵌入式技 ? 2023-05-25 14:14 ? 次閱讀

一、前言

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

image-20230525140855726

image-20230525140932125

二、排序算法

【1】冒泡排序

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

冒泡排序的過程如下:

  1. 從數組的第一個元素開始,依次比較相鄰的兩個元素,如果前一個元素比后一個元素大,則交換這兩個元素的位置。
  2. 繼續比較相鄰的元素,直到數組的最后一個元素。
  3. 重復執行步驟1和步驟2,直到整個數組都按照從小到大的順序排列好。

冒泡排序的時間復雜度是O(N^2),其中N是數組中元素的數量。在實際應用中,由于其時間復雜度較高,冒泡排序很少被用于大規模數據的排序,但它仍然是一種優秀的教學工具,因為它容易理解和實現,并且可以幫助初學者理解排序算法的基本思想。

以下是C語言代碼的實現,封裝為名為calculateAverage的函數。

#define ARRAY_SIZE 20
 ?
 // 冒泡排序算法函數
 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;
             }
         }
     }
 }
 ?
 // 計算平均值函數,去除最大值和最小值
 int calculateAverage() {
     int arr[ARRAY_SIZE];
     // 連續讀取20次數據
     for(int i = 0; i < ARRAY_SIZE; i++) {
         arr[i] = ReadADC();
     }
     // 對數組進行排序
     bubbleSort(arr, ARRAY_SIZE);
     // 去掉最大值和最小值
     int sum = 0;
     for(int i = 1; i < ARRAY_SIZE-1; i++) {
         sum += arr[i];
     }
     // 計算平均值并返回
     return sum / (ARRAY_SIZE-2);
 }

在函數中,首先定義了一個常量ARRAY_SIZE表示需要讀取的數據的數量。然后,使用一個循環讀取20次數據,并將它們存儲到一個數組中。接著,用冒泡排序算法對數組進行排序。在排序完成后,計算數組中除去最大值和最小值的元素之和,并計算平均值。最后,返回計算得到的平均值。

【2】插入排序

插入排序(Insertion Sort)是一種簡單直觀的排序算法,它的基本思想是將一個元素插入到已排序好的序列中的適當位置,使得插入后仍然有序。

插入排序的過程如下:

  1. 假設第一個元素已經是排好序的序列,從第二個元素開始,依次將每個元素插入到已經排好序的序列中。
  2. 每次從未排序的部分中取出一個元素,與已排序的序列中的元素從后向前依次比較,找到插入的位置,即找到一個比當前元素小的值或者已經到了開頭位置。
  3. 將當前元素插入到已排序序列的合適位置上,重新調整已排序的序列,繼續對未排序的序列進行排序。
  4. 重復執行步驟2和步驟3,直到整個數組都按照從小到大的順序排列好。

插入排序的時間復雜度是O(N^2),其中N是數組中元素的數量。在實際應用中,插入排序通常適用于處理小規模數據或者已經接近有序的數據,因為此時插入排序的效率高于其他排序算法。

以下是C語言代碼的實現,封裝為名為calculateAverage的函數。

#define ARRAY_SIZE 20
 ?
 // 插入排序算法函數
 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;
     }
 }
 ?
 // 計算平均值函數,去除最大值和最小值
 int calculateAverage() {
     int arr[ARRAY_SIZE];
     // 連續讀取20次數據
     for(int i = 0; i < ARRAY_SIZE; i++) {
         arr[i] = ReadADC();
     }
     // 對數組進行排序
     insertionSort(arr, ARRAY_SIZE);
     // 去掉最大值和最小值
     int sum = 0;
     for(int i = 1; i < ARRAY_SIZE-1; i++) {
         sum += arr[i];
     }
     // 計算平均值并返回
     return sum / (ARRAY_SIZE-2);
 }

在函數中,首先定義了一個常量ARRAY_SIZE表示需要讀取的數據的數量。然后,使用一個循環讀取20次數據,并將它們存儲到一個數組中。接著,用插入排序算法對數組進行排序。在排序完成后,計算數組中除去最大值和最小值的元素之和,并計算平均值。最后,返回計算得到的平均值。

【3】希爾排序

希爾排序(Shell Sort)是一種由Donald Shell在1959年發明的排序算法,它是插入排序的一種變體,旨在減少排序中元素的移動次數,從而使算法更快。希爾排序的基本思想是把數組中相距某個“增量”的元素組成一個子序列,對每個子序列進行插入排序,然后逐步縮小增量,重復進行上述操作,直到增量為1,最后再對整個數組進行一次插入排序。

希爾排序的過程如下:

  1. 選擇一個增量序列,將待排序的數組按照這個增量序列分成若干組(子序列)。通常,在第一次排序時,增量取數組長度的一半,以后每次將增量減半,直到增量為1。
  2. 對每個子序列進行插入排序,即將每個子序列中的元素按照遞增的順序插入到已排序好的序列中。
  3. 重復執行步驟2,改變增量,直到增量為1。
  4. 最后再對整個數組進行插入排序。

希爾排序的時間復雜度與所選取的增量序列有關。最壞情況下的時間復雜度為O(N^2),其中N是數組中元素的數量。但在大多數情況下,希爾排序的時間復雜度優于O(N^2),可以達到O(N log N)的級別。希爾排序的空間復雜度為O(1),因為它在排序過程中只需要常數個額外的存儲空間。

以下是C語言代碼實現,封裝為名為calculateAverage的函數。

#define ARRAY_SIZE 20
 ?
 // 希爾排序算法函數
 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;
         }
     }
 }
 ?
 // 計算平均值函數,去除最大值和最小值
 int calculateAverage() {
     int arr[ARRAY_SIZE];
     // 連續讀取20次數據
     for(int i = 0; i < ARRAY_SIZE; i++) {
         arr[i] = ReadADC();
     }
     // 對數組進行排序
     shellSort(arr, ARRAY_SIZE);
     // 去掉最大值和最小值
     int sum = 0;
     for(int i = 1; i < ARRAY_SIZE-1; i++) {
         sum += arr[i];
     }
     // 計算平均值并返回
     return sum / (ARRAY_SIZE-2);
 }

在函數中,首先定義了一個常量ARRAY_SIZE表示需要讀取的數據的數量。然后,使用一個循環讀取20次數據,并將它們存儲到一個數組中。接著,用希爾排序算法對數組進行排序。在排序完成后,計算數組中除去最大值和最小值的元素之和,并計算平均值。最后,返回計算得到的平均值。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 傳感器
    +關注

    關注

    2552

    文章

    51237

    瀏覽量

    754753
  • 單片機
    +關注

    關注

    6039

    文章

    44583

    瀏覽量

    636494
  • 數據
    +關注

    關注

    8

    文章

    7085

    瀏覽量

    89203
  • 物聯網
    +關注

    關注

    2910

    文章

    44778

    瀏覽量

    374665
  • STM32
    +關注

    關注

    2270

    文章

    10910

    瀏覽量

    356604
收藏 人收藏

    評論

    相關推薦

    FPGA排序-冒泡排序介紹

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

    labview 版的冒泡排序

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

    冒泡排序

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

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

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

    嵌入式stm32實用的排序算法 - 交換排序

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

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

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

    冒泡排序法的具體實現方法是什么?

    什么是冒泡排序冒泡排序法的具體實現方法是什么?
    發表于 07-15 06:48

    基于STM32單片機水質檢測PH檢測采集傳感器模塊設計資料分享

    系統功能設計(末尾附文件)本系統由STM32單片機核心板、超聲波測距模塊、PH傳感器模塊、電導率傳感器、LCD1602液晶及電源組成。1、超聲波
    發表于 02-21 06:01

    一文了解冒泡排序

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

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

    01 — 冒泡排序 在實現冒泡排序代碼之前我們先理解一下什么是冒泡排序,我們舉一個現實生活中的例
    的頭像 發表于 06-18 09:57 ?1556次閱讀

    C語言冒泡排序工程代碼匯總

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

    冒泡排序的基本思想

    冒泡排序的英文Bubble Sort,是一種最基礎的交換排序。之所以叫做冒泡排序,因為每一個元素都可以像小氣泡一樣,根據自身大小一點一點向數
    的頭像 發表于 01-20 11:38 ?5925次閱讀
    <b class='flag-5'>冒泡</b><b class='flag-5'>排序</b>的基本思想

    php版冒泡排序是如何實現的?

    無論學習哪一種編程語言,進行算法方面的訓練時都繞不開“排序”。排序在進階編程中有非常廣泛的應用,要想成為編程高手,排序算法是必須要掌握的。而冒泡排序
    的頭像 發表于 01-20 10:39 ?952次閱讀
    php版<b class='flag-5'>冒泡</b><b class='flag-5'>排序</b>是如何實現的?

    怎樣運用Java實現冒泡排序和Arrays排序出來

    數據結構中我們學習了解了冒泡排序和Arrays排序的基本算法,但沒能夠用編程語言實現出來。那我們應該怎樣運用Java通過編程語言將
    的頭像 發表于 03-02 09:37 ?519次閱讀
    怎樣運用Java實現<b class='flag-5'>冒泡</b><b class='flag-5'>排序</b>和Arrays<b class='flag-5'>排序</b>出來

    jwt冒泡排序的原理

    jwt簡介 冒泡排序: (Bubble Sort)是一種簡單的交換排序。之所以叫做冒泡排序,因為我們可以把每個元素當成一個小氣泡,根據氣泡大
    的頭像 發表于 09-25 16:33 ?556次閱讀
    jwt<b class='flag-5'>冒泡</b><b class='flag-5'>排序</b>的原理
    主站蜘蛛池模板: 特级全黄一级毛片免费| 奇米影视久久| 爱综合网| 一级毛片在线播放| 六月天色婷婷| 四虎国产精品免费观看| 美女扒开尿囗给男生桶爽| ak福利午夜在线观看| 色四虎| 在线视频久久| 成人的天堂视频一区二区三区| 欧美色视频在线| 婷婷在线五月| 国产精品久久久久免费| www.欧美成| 1024 在线观看视频免费| 欧美黄业| 五月天伦理| 亚洲免费黄色网址| fc2 ppv sss级素人美女| 国产主播在线看| 免费人成黄页在线观看日本| 日韩欧美亚洲综合一区二区| 午夜日韩视频| 婷婷色婷婷| 免费在线播放黄色| www一区| 8000av在线| 伊人天天操| 毛片视频免费网站| 九色国产在线| 国产巨大bbbb天美| 九九热在线视频观看这里只有精品| 波多野结衣一级毛片| 深夜动态福利gif动态进| 视频一区二区三区在线观看| 伊人久久大香线蕉综合高清 | 看毛片的网站| 一本大道香蕉大vr在线吗视频| 久久精品影院永久网址| 57pao强力打造免费高清高速|