一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

實(shí)用的排序算法 - 交換排序

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

掃碼添加小助手

加入工程師交流群

寫在前面 Ⅰ

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

在某些情況下就需要對(duì)一組數(shù)據(jù)進(jìn)行排序,并提取頭特定的數(shù)據(jù)出來(lái)使用。

排序的應(yīng)用場(chǎng)合很多,我這里就不再一一舉例說(shuō)明,掌握排序的基本算法,到時(shí)候遇到就有用武之地。

排序算法分類 Ⅱ

1.按存儲(chǔ)分類:內(nèi)部排序和外部排序

內(nèi)部排序:是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序;

外部排序:是因排序的數(shù)據(jù)很大,一般一次不能容納全部的排序記錄,在排序過(guò)程中需要訪問(wèn)外存。

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

2.內(nèi)部排序分類:插入排序、選擇排序、交換排序、歸并排序、基數(shù)排序。

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

在內(nèi)部排序中,最常見、有效且實(shí)用的排序算是交換排序,本文將在下面章節(jié)重點(diǎn)講述交換排序中的冒泡排序和快速排序。

交換排序 Ⅲ

1.冒泡排序

冒牌排序是我們讀書時(shí)最先接觸的一種排序算法,也是比較經(jīng)典的排序算法。

冒泡排序就是在要排序的一組數(shù)中,對(duì)當(dāng)前還未排好序范圍內(nèi)的全部數(shù),自上而下對(duì)相鄰的兩個(gè)數(shù)依次進(jìn)行比較和調(diào)整,讓較大的數(shù)往下沉,較小的往上冒。即:每當(dāng)兩相鄰的數(shù)比較后發(fā)現(xiàn)它們的排序與排序要求相反時(shí),就將它們互換。

原始的冒泡排序函數(shù):

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;

}

}

}

}

其實(shí),原始的冒泡排序不是最后的算法,如果進(jìn)行某一趟排序時(shí)并沒有進(jìn)行數(shù)據(jù)交換,則說(shuō)明數(shù)據(jù)已經(jīng)按要求排列好,可立即結(jié)束排序,避免不必要的比較過(guò)程。

對(duì)冒泡排序常見的改進(jìn)方法是加入標(biāo)志性變量,用于標(biāo)志某一趟排序過(guò)程中是否有數(shù)據(jù)交換。

第1種改進(jìn)法:設(shè)置一標(biāo)志性變量pos,用于記錄每趟排序中最后一次進(jìn)行交換的位置。由于pos位置之后的記錄均已交換到位,故在進(jìn)行下一趟排序時(shí)只要掃描到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種改進(jìn)法:傳統(tǒng)冒泡排序中每一趟排序操作只能找到一個(gè)最大值或最小值,我們考慮利用在每趟排序中進(jìn)行正向和反向兩遍冒泡的方法一次可以得到兩個(gè)最終值(最大者和最小者) , 從而使排序趟數(shù)幾乎減少了一半。

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)選擇一個(gè)基準(zhǔn)元素,通常選擇第一個(gè)元素或者最后一個(gè)元素。

2)通過(guò)一趟排序?qū)⒋判虻挠涗浄指畛瑟?dú)立的兩部分,其中一部分記錄的元素值均比基準(zhǔn)元素值小。另一部分記錄的元素值比基準(zhǔn)值大。

3)此時(shí)基準(zhǔn)元素在其排好序后的正確位置。

4)然后分別對(duì)這兩部分記錄用同樣的方法繼續(xù)進(jìn)行排序,直到整個(gè)序列有序。

舉例:

對(duì)無(wú)序數(shù)組[6 2 4 1 5 9]排序:

a),先把第一項(xiàng)[6]取出來(lái),

用[6]依次與其余項(xiàng)進(jìn)行比較:

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

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

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

排序前62 4 1 5 9

排序后 2 4 1 569

b),對(duì)前半邊[2 4 1 5]繼續(xù)進(jìn)行快速排序

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

排序前24 1 5

排序后 124 5

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

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

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

排序結(jié)束

代碼

將前后分開函數(shù):

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;

}

快速排序函數(shù):

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);

}

}

舉例測(cè)試:

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]);

}

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

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

    關(guān)注

    99

    文章

    6709

    瀏覽量

    549230
  • 排序
    +關(guān)注

    關(guān)注

    0

    文章

    32

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Texas Instruments TPS743低壓差 (LDO) 線性穩(wěn)壓器數(shù)據(jù)手冊(cè)

    和內(nèi)核引腳之間ESD結(jié)構(gòu)的應(yīng)力。借助電源良好輸出和使能輸入,可使用外部穩(wěn)壓器輕松實(shí)現(xiàn)排序。借助這種靈活性,用戶可以配置解決方案,滿足DSP、FPGA和其他具有特殊啟動(dòng)要求的應(yīng)用的排序要求。
    的頭像 發(fā)表于 07-04 15:41 ?195次閱讀
    Texas Instruments TPS743低壓差 (LDO) 線性穩(wěn)壓器數(shù)據(jù)手冊(cè)

    國(guó)際首創(chuàng)新突破!中國(guó)團(tuán)隊(duì)以存算一體排序架構(gòu)攻克智能硬件加速難題

    2025 年 6 月 25 日,北京大學(xué)團(tuán)隊(duì)在智能計(jì)算硬件方面取得領(lǐng)先突破,國(guó)際上首次實(shí)現(xiàn)了基于存算一體技術(shù)的高效排序硬件架構(gòu) (A fast and reconfigurable
    的頭像 發(fā)表于 07-02 16:50 ?219次閱讀
    國(guó)際首創(chuàng)新突破!中國(guó)團(tuán)隊(duì)以存算一體<b class='flag-5'>排序</b>架構(gòu)攻克智能硬件加速難題

    Analog Devices Inc. MAX16895 監(jiān)控電路特性/應(yīng)用/功能圖

    Analog Devices MAX16895監(jiān)控電路是小型、低功耗、電壓監(jiān)控電路,具有排序功能。這些器件具有可調(diào)的、低至0.5V的電壓監(jiān)控閾值,并可利用外部電容調(diào)節(jié)延遲時(shí)間。這些Analog Devices器件非常適合用于電源排序、復(fù)位
    的頭像 發(fā)表于 06-26 09:34 ?122次閱讀
    Analog Devices Inc. MAX16895 監(jiān)控電路特性/應(yīng)用/功能圖

    雙電機(jī)同步驅(qū)動(dòng)系統(tǒng)控制參數(shù)整定研究

    對(duì)系統(tǒng)進(jìn)行建模后,首先采用傳統(tǒng)遺傳算法,對(duì)多通道多控制器系統(tǒng)的控制器參數(shù)進(jìn)行整定;然后從系統(tǒng)整體性能的角度出發(fā),利用帶精英策略的非支配排序遺傳算法對(duì)系統(tǒng)控制器參數(shù)進(jìn)行多目標(biāo)整定。仿真結(jié)果表明:采用雙通道
    發(fā)表于 06-19 11:04

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

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

    UCD9224 2 MHz、2 軌、4 相數(shù)字 PWM 降壓控制器,具有改進(jìn)的排序功能技術(shù)資料

    和管理。 UCD9224 旨在為非隔離式 DC/DC 轉(zhuǎn)換器應(yīng)用提供各種理想的功能,同時(shí)通過(guò)減少外部電路來(lái)最大限度地減少系統(tǒng)組件總數(shù)。該解決方案將多回路管理與排序、裕度、跟蹤和智能相位管理集成在一起,以優(yōu)化整體系統(tǒng)效率。此外,還支持環(huán)路補(bǔ)償和校準(zhǔn),無(wú)需添加外部元件。
    的頭像 發(fā)表于 03-28 15:44 ?333次閱讀
    UCD9224 2 MHz、2 軌、4 相數(shù)字 PWM 降壓控制器,具有改進(jìn)的<b class='flag-5'>排序</b>功能技術(shù)資料

    TPS74701-Q1 具有電源正常功能的汽車類 500mA、低 VIN (0.8V)、可調(diào)超低壓差穩(wěn)壓器數(shù)據(jù)手冊(cè)

    型的處理器和 ASIC 供電而設(shè)計(jì)。使能輸入和電源就緒輸出允許使用外部穩(wěn)壓器輕松排序,從而允許配置滿足具有特殊啟動(dòng)要求的廣泛應(yīng)用的排序要求的解決方案。
    的頭像 發(fā)表于 03-06 14:46 ?549次閱讀
    TPS74701-Q1 具有電源正常功能的汽車類 500mA、低 VIN (0.8V)、可調(diào)超低壓差穩(wěn)壓器數(shù)據(jù)手冊(cè)

    詳解Linux sort命令之掌握排序技巧與實(shí)用案例

    在linux系統(tǒng)使用過(guò)程中,提供了sort排序命令,支持常用的排序功能。 常用參數(shù) sort命令支持很多參數(shù),常用參數(shù)如下: ? 短參數(shù) 長(zhǎng)參數(shù) 說(shuō)明 -n – number-sort 按字符串?dāng)?shù)值
    的頭像 發(fā)表于 01-09 10:10 ?934次閱讀

    TimSort:一個(gè)在標(biāo)準(zhǔn)函數(shù)庫(kù)中廣泛使用的排序算法

    在計(jì)算機(jī)科學(xué)的領(lǐng)域,排序算法是每位學(xué)生必學(xué)的基礎(chǔ),而排序的需求是每位程序員在編程過(guò)程中都會(huì)遇到的。 在你輕松調(diào)用 .sort() 方法對(duì)數(shù)據(jù)進(jìn)行排序時(shí),是否曾好奇過(guò),這個(gè)簡(jiǎn)單的方法背后
    的頭像 發(fā)表于 01-03 11:42 ?577次閱讀

    dp接口的最新技術(shù)發(fā)展

    深度優(yōu)先搜索(DFS)是一種基本的算法,用于遍歷或搜索樹或圖。它從一個(gè)頂點(diǎn)開始,盡可能深地搜索樹的分支。當(dāng)搜索到最深節(jié)點(diǎn)時(shí),然后回溯。DFS可以用于解決許多問(wèn)題,如尋找路徑、檢測(cè)循環(huán)、拓?fù)?b class='flag-5'>排序等
    的頭像 發(fā)表于 10-30 13:52 ?578次閱讀

    時(shí)間復(fù)雜度為 O(n^2) 的排序算法

    作者:京東保險(xiǎn) 王奕龍 對(duì)于小規(guī)模數(shù)據(jù),我們可以選用時(shí)間復(fù)雜度為 O(n2) 的排序算法。因?yàn)闀r(shí)間復(fù)雜度并不代表實(shí)際代碼的執(zhí)行時(shí)間,它省去了低階、系數(shù)和常數(shù),僅代表的增長(zhǎng)趨勢(shì),所以在小規(guī)模數(shù)據(jù)情況下
    的頭像 發(fā)表于 10-19 16:31 ?1739次閱讀
    時(shí)間復(fù)雜度為 O(n^2) 的<b class='flag-5'>排序</b><b class='flag-5'>算法</b>

    TPS54120排序和跟蹤

    電子發(fā)燒友網(wǎng)站提供《TPS54120排序和跟蹤.pdf》資料免費(fèi)下載
    發(fā)表于 10-10 10:54 ?0次下載
    TPS54120<b class='flag-5'>排序</b>和跟蹤

    數(shù)學(xué)建模(2)--TOPSIS法

    和K.Yoon于1981年首次提出,TOPSIS法根據(jù)有限個(gè)評(píng)價(jià)對(duì)象與理想化目標(biāo)的接近程度進(jìn)行排序的方法,是在現(xiàn)有的對(duì)象中進(jìn)行相對(duì)優(yōu)劣的評(píng)價(jià)。TOPSIS法是一種逼近于理想解的排序法,該方法只要求各效用函數(shù)具有
    發(fā)表于 09-06 16:38

    芯干線科技CEO說(shuō)氮化鎵

    氮化鎵是一種由氮和鎵結(jié)合而來(lái)的化合物,其中氮在元素周期表排序第7位,鎵排序第31位,7月31日世界氮化鎵日因此得名,同時(shí)也以英文名GaN Day傳播到全球,并獲得行業(yè)廣泛認(rèn)可。
    的頭像 發(fā)表于 08-21 10:03 ?1075次閱讀

    飛凌OK-全志T527開發(fā)板nbench性能測(cè)試

    要將Makefile中的CC改為aarch64-linux-gnu-gcc,才可以得到對(duì)應(yīng)平臺(tái)支持的二進(jìn)制文件。 Make Step3:運(yùn)行測(cè)試 ./nbench 測(cè)試項(xiàng)含義 NUMERIC SORT數(shù)字排序
    發(fā)表于 08-20 10:25