国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

實用的排序算法 - 交換排序

黃工的嵌入式技術圈 ? 來源:黃工的嵌入式技術圈 ? 2020-03-20 09:53 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

寫在前面 Ⅰ

前面寫了關于ADC采集電壓的文章,大家除了求平均的方式來處理采樣值,還有沒有使用到其他的方式來處理采集值呢?

在某些情況下就需要對一組數據進行排序,并提取頭特定的數據出來使用。

排序的應用場合很多,我這里就不再一一舉例說明,掌握排序的基本算法,到時候遇到就有用武之地。

排序算法分類 Ⅱ

1.按存儲分類:內部排序和外部排序

內部排序:是數據記錄在內存中進行排序;

外部排序:是因排序的數據很大,一般一次不能容納全部的排序記錄,在排序過程中需要訪問外存。

內部排序高速、有效,是我們比較常用的排序方法。外部排序速度慢,效率低,一般不建議使用外部排序,比較實用的排序還是只有內部排序。

2.內部排序分類:插入排序、選擇排序、交換排序、歸并排序、基數排序。

排序的分類大致為如下圖:

在內部排序中,最常見、有效且實用的排序算是交換排序,本文將在下面章節重點講述交換排序中的冒泡排序和快速排序。

交換排序 Ⅲ

1.冒泡排序

冒牌排序是我們讀書時最先接觸的一種排序算法,也是比較經典的排序算法。

冒泡排序就是在要排序的一組數中,對當前還未排好序范圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較后發現它們的排序與排序要求相反時,就將它們互換。

原始的冒泡排序函數:

void bubbleSort(int a[], int n)

{

for(int i =0 ; i< n-1; ++i)

{

for(int j = 0; j < n-i-1; ++j)

{

if(a[j] > a[j+1])

{

int tmp = a[j];

a[j] = a[j+1];

a[j+1] = tmp;

}

}

}

}

其實,原始的冒泡排序不是最后的算法,如果進行某一趟排序時并沒有進行數據交換,則說明數據已經按要求排列好,可立即結束排序,避免不必要的比較過程。

對冒泡排序常見的改進方法是加入標志性變量,用于標志某一趟排序過程中是否有數據交換。

第1種改進法:設置一標志性變量pos,用于記錄每趟排序中最后一次進行交換的位置。由于pos位置之后的記錄均已交換到位,故在進行下一趟排序時只要掃描到pos位置即可。

void Bubble_1( int r[], int n)

{

int pos = 0;

int i;

int j;

int tmp;

i = n - 1;

while(i > 0)

{

for(j=0; j

{

if(r[j] > r[j+1])

{

pos = j; //記錄交換的位置

tmp = r[j];

r[j] = r[j+1];

r[j+1] = tmp;

}

}

i= pos;

}

}

第2種改進法:傳統冒泡排序中每一趟排序操作只能找到一個最大值或最小值,我們考慮利用在每趟排序中進行正向和反向兩遍冒泡的方法一次可以得到兩個最終值(最大者和最小者) , 從而使排序趟數幾乎減少了一半。

void Bubble_2(int r[], int n)

{

int low = 0;

int high= n -1;

int tmp,j;

while(low < high)

{

for(j=low; j//正向冒泡,找到最大者

{

if(r[j]> r[j+1])

{

tmp = r[j];

r[j]=r[j+1];

r[j+1]=tmp;

}

--high;

for(j=high; j>low; --j)//反向冒泡,找到最小者

{

if(r[j]

{

tmp = r[j];

r[j]=r[j-1];

r[j-1]=tmp;

}

++low;

}

}

}

}

2.快速排序

大致步驟如下:

1)選擇一個基準元素,通常選擇第一個元素或者最后一個元素。

2)通過一趟排序將待排序的記錄分割成獨立的兩部分,其中一部分記錄的元素值均比基準元素值小。另一部分記錄的元素值比基準值大。

3)此時基準元素在其排好序后的正確位置。

4)然后分別對這兩部分記錄用同樣的方法繼續進行排序,直到整個序列有序。

舉例:

對無序數組[6 2 4 1 5 9]排序:

a),先把第一項[6]取出來,

用[6]依次與其余項進行比較:

如果比[6]小就放[6]前邊,2 4 1 5都比[6]小,所以全部放到[6]前邊;

如果比[6]大就放[6]后邊,9比[6]大,放到[6]后邊;

一趟排完后變成下邊這樣:

排序前62 4 1 5 9

排序后 2 4 1 569

b),對前半邊[2 4 1 5]繼續進行快速排序

重復步驟a)后變成下邊這樣:

排序前24 1 5

排序后 124 5

前半邊排序完成,總的排序也完成:

排序前:[6 2 4 1 5 9]

排序后:[1 2 4 5 6 9]

排序結束

代碼

將前后分開函數:

int partition(int unsorted[], int low, int high)

{

int pivot = unsorted[low];

while(low < high)

{

while((low < high) && (unsorted[high] >= pivot))

--high;

unsorted[low] = unsorted[high];

while((low < high) && (unsorted[low] <= pivot))

++low;

unsorted[high] = unsorted[low];

}

unsorted[low] = pivot;

return low;

}

快速排序函數:

void quickSort(int unsorted[], int low, int high)

{

int loc = 0;

if(low < high)

{

loc = partition(unsorted, low, high);

quickSort(unsorted, low, loc -1);

quickSort(unsorted, loc + 1, high);

}

}

舉例測試:

void Main(void)

{

int i;

int a[6] = {6, 2, 4, 1, 5, 9};

quickSort(a, 0, 5);

for(i=0; i<6; i++)

printf("a[%d] = a[%d]\n", i, a[i]);

}

在排序算法中,這兩種是較重要的排序算法,其他算法在特定場合也有用武之地,本文暫時講述到這里。

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

    關注

    100

    文章

    7511

    瀏覽量

    555913
  • 排序
    +關注

    關注

    0

    文章

    32

    瀏覽量

    9975
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    MAX16050/MAX16051:電壓監測與排序電路的理想選擇

    MAX16050/MAX16051:電壓監測與排序電路的理想選擇 在電子設計領域,對于電壓監測和電源排序的需求日益增長,特別是在服務器、工作站、網絡系統等復雜設備中。今天,我們就來深入探討
    的頭像 發表于 03-02 09:15 ?55次閱讀

    深入解析 LTC2923:電源跟蹤與排序的理想解決方案

    深入解析 LTC2923:電源跟蹤與排序的理想解決方案 在電子設備的設計中,電源的跟蹤和排序至關重要,它直接影響著設備的性能和穩定性。LTC2923 作為一款強大的電源跟蹤控制器,為我們提供了簡單
    的頭像 發表于 02-28 15:35 ?108次閱讀

    ADM6819/ADM6820:簡單電源排序器的技術剖析與應用指南

    ADM6819/ADM6820:簡單電源排序器的技術剖析與應用指南 在電子設備的設計中,電源排序對于確保系統的穩定運行至關重要。ADM6819和ADM6820作為具有FET驅動能力的簡單電源排序
    的頭像 發表于 02-28 14:25 ?116次閱讀

    探秘ADM1186:高效電壓監測與排序芯片的應用指南

    探秘ADM1186:高效電壓監測與排序芯片的應用指南 在電子工程師的日常工作中,電源管理是一個至關重要的環節。良好的電源管理不僅能確保設備的穩定運行,還能提高系統的可靠性和性能。今天,我們就來深入
    的頭像 發表于 02-28 14:25 ?130次閱讀

    ADM1066:多功能電源監控與排序芯片的深度解析

    ADM1066:多功能電源監控與排序芯片的深度解析 在電子設備的設計中,電源的監控與排序是確保系統穩定運行的關鍵環節。ADM1066作為一款功能強大的電源監控與排序芯片,為多電源系統提供了全面
    的頭像 發表于 02-28 14:05 ?72次閱讀

    ADM1068:多功能電源監控與排序芯片的深度解析

    ADM1068:多功能電源監控與排序芯片的深度解析 在電子系統設計中,電源的監控與排序至關重要,它直接關系到系統的穩定性和可靠性。今天,我們就來深入探討一款功能強大的電源監控與排序芯片
    的頭像 發表于 02-28 14:05 ?77次閱讀

    LTC2937:六通道電源排序器與電壓監控器的設計與應用

    LTC2937:六通道電源排序器與電壓監控器的設計與應用 在電子系統設計中,電源管理是至關重要的一環。合理的電源排序和電壓監控能夠確保系統的穩定運行,避免因電源問題導致的故障和損壞。今天,我們就來
    的頭像 發表于 02-28 11:15 ?142次閱讀

    ADM1169:多電源系統的監控與排序解決方案

    ADM1169:多電源系統的監控與排序解決方案 在電子工程師的日常工作中,多電源系統的監控與排序是一個關鍵且復雜的問題。今天要為大家介紹的Analog Devices的ADM1169 Super
    的頭像 發表于 02-28 11:10 ?125次閱讀

    ADM1166:多電源系統監控與排序的理想解決方案

    ADM1166:多電源系統監控與排序的理想解決方案 在多電源系統的設計中,對電源的監控和排序是至關重要的環節。ADM1166作為一款可配置的監控/排序設備,為多電源系統的電源監控和排序
    的頭像 發表于 02-28 11:10 ?129次閱讀

    探索LM3880:三軌簡單電源排序器的卓越性能與應用

    探索LM3880:三軌簡單電源排序器的卓越性能與應用 在電子設計領域,電源管理是一個至關重要的環節。今天,我們將深入探討德州儀器(TI)推出的LM3880三軌簡單電源排序器,它為多電壓軌的電源排序
    的頭像 發表于 02-26 17:20 ?493次閱讀

    MAX16050/MAX16051:具備反向排序功能的電壓監控與排序電路

    MAX16050/MAX16051:具備反向排序功能的電壓監控與排序電路 在電子系統設計中,對電源電壓的精確監控和有序控制至關重要。Maxim Integrated推出的MAX16050
    的頭像 發表于 01-31 17:15 ?780次閱讀

    里可以添加本文要記錄的大

    的元素列,依次比較兩個相鄰的元素,如果順序錯誤進行交換。重復地檢查對比直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。算法的名字由來是因為越小(大)的元素會經由
    發表于 01-27 22:05

    C語言插入排序算法和代碼

    插入排序排序算法的一種,它不改變原有的序列(數組),而是創建一個新的序列,在新序列上進行操作。   這里以從小到大排序為例進行講解。   基本思想及舉例說明   插入
    發表于 01-15 06:44

    光纖線芯都是按照什么顏色排序

    多次有朋友留言問到,光纖熔接顏色如何排序,這個在實際應用中還是比較多的,那么今天我們就不講原理了,直接用圖文簡單明了講光纖熔接色譜,大家可以了解下。 一、常規排序 1、4芯的排序:藍、橙、綠、棕
    的頭像 發表于 12-19 11:02 ?1368次閱讀

    低成本電源排序器解決方案

    絕大多數負載點DC-DC轉換器可以將上一個轉換器的電源就緒輸出連接至下一個轉換器的使能輸入,實現上電排序。這種方法只適合比較簡單的設計,不能滿足多數現代微處理器和DSP的要求一這類器件要求斷電順序必須與上電順序相反。許多廠商針對這類應用推出了可編程排序IC,但器件價格較為
    的頭像 發表于 05-21 09:55 ?1184次閱讀
    低成本電源<b class='flag-5'>排序</b>器解決方案