色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

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

黃工的嵌入式技術圈 ? 來源:黃工的嵌入式技術圈 ? 2020-03-20 09:53 ? 次閱讀

寫在前面 Ⅰ

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

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

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

排序算法分類 Ⅱ

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

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

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

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

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

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

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

交換排序 Ⅲ

1.冒泡排序

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

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

原始的冒泡排序函數(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ù)交換,則說明數(shù)據(jù)已經(jīng)按要求排列好,可立即結(jié)束排序,避免不必要的比較過程。

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

第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種改進法:傳統(tǒng)冒泡排序中每一趟排序操作只能找到一個最大值或最小值,我們考慮利用在每趟排序中進行正向和反向兩遍冒泡的方法一次可以得到兩個最終值(最大者和最小者) , 從而使排序趟數(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)選擇一個基準元素,通常選擇第一個元素或者最后一個元素。

2)通過一趟排序?qū)⒋判虻挠涗浄指畛瑟毩⒌膬刹糠郑渲幸徊糠钟涗浀脑刂稻然鶞试刂敌 A硪徊糠钟涗浀脑刂当然鶞手荡蟆?/p>

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

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

舉例:

對無序數(shù)組[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]繼續(xù)進行快速排序

重復步驟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);

}

}

舉例測試:

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

}

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

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

    關注

    99

    文章

    6531

    瀏覽量

    545407
  • 排序
    +關注

    關注

    0

    文章

    32

    瀏覽量

    9723
收藏 人收藏

    評論

    相關推薦

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

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

    TimSort:一個在標準函數(shù)庫中廣泛使用的排序算法

    在計算機科學的領域,排序算法是每位學生必學的基礎,而排序的需求是每位程序員在編程過程中都會遇到的。 在你輕松調(diào)用 .sort() 方法對數(shù)據(jù)進行排序時,是否曾好奇過,這個簡單的方法背后
    的頭像 發(fā)表于 01-03 11:42 ?104次閱讀

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

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

    TPS54120排序和跟蹤

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

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

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

    手把手教你排序算法怎么寫

    今天以直接插入排序算法,給大家分享一下排序算法的實現(xiàn)思路,主要包含以下部分內(nèi)容:插入排序介紹插入排序
    的頭像 發(fā)表于 06-04 08:03 ?748次閱讀
    手把手教你<b class='flag-5'>排序</b><b class='flag-5'>算法</b>怎么寫

    具有先進排序和輸出裕度的中輸入同步降壓控制器TPS40101數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《具有先進排序和輸出裕度的中輸入同步降壓控制器TPS40101數(shù)據(jù)表.pdf》資料免費下載
    發(fā)表于 04-22 10:26 ?0次下載
    具有先進<b class='flag-5'>排序</b>和輸出裕度的中輸入同步降壓控制器TPS40101數(shù)據(jù)表

    具有先進排序和輸出裕度的中輸入同步降壓控制器TPS40100數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《具有先進排序和輸出裕度的中輸入同步降壓控制器TPS40100數(shù)據(jù)表.pdf》資料免費下載
    發(fā)表于 04-17 10:59 ?0次下載
    具有先進<b class='flag-5'>排序</b>和輸出裕度的中輸入同步降壓控制器TPS40100數(shù)據(jù)表

    3-A、3.3/5V輸入、可調(diào)開關穩(wěn)壓器,具有自動跟蹤TM排序功能PTH04000W數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《3-A、3.3/5V輸入、可調(diào)開關穩(wěn)壓器,具有自動跟蹤TM排序功能PTH04000W數(shù)據(jù)表.pdf》資料免費下載
    發(fā)表于 04-17 09:32 ?0次下載
    3-A、3.3/5V輸入、可調(diào)開關穩(wěn)壓器,具有自動跟蹤TM<b class='flag-5'>排序</b>功能PTH04000W數(shù)據(jù)表

    Linux的sort命令介紹

    1.命令簡介以行為單位對文本文件的內(nèi)容進行排序,將結(jié)果顯示在標準輸出,比較原則是從行首字符向后,依次按 ASCII 碼值進行比較,最后按升序輸出。如果 file 參數(shù)指定多個文件,那么 sort
    發(fā)表于 04-08 07:16

    支持 ACPI 的 10 軌電源排序器和監(jiān)視器UCD9090A數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《支持 ACPI 的 10 軌電源排序器和監(jiān)視器UCD9090A數(shù)據(jù)表.pdf》資料免費下載
    發(fā)表于 03-29 09:12 ?0次下載
    支持 ACPI 的 10 軌電源<b class='flag-5'>排序</b>器和監(jiān)視器UCD9090A數(shù)據(jù)表

    用FPGA實現(xiàn)雙調(diào)排序的方法(2)

    典型的排序算法包括冒泡排序、選擇排序、插入排序、歸并排序、快速
    的頭像 發(fā)表于 03-21 10:28 ?666次閱讀
    用FPGA實現(xiàn)雙調(diào)<b class='flag-5'>排序</b>的方法(2)

    FPGA實現(xiàn)雙調(diào)排序算法的探索與實踐

    雙調(diào)排序(BitonicSort)是數(shù)據(jù)獨立(Data-independent)的排序算法,即比較順序與數(shù)據(jù)無關,特別適合并行執(zhí)行。在了解雙調(diào)排序
    發(fā)表于 03-14 09:50 ?700次閱讀
    FPGA實現(xiàn)雙調(diào)<b class='flag-5'>排序</b><b class='flag-5'>算法</b>的探索與實踐

    想聽聽48和大對數(shù)光纜的排序

    48芯光纜和大對數(shù)光纜都是光纜中的一種,它們的區(qū)別在于芯數(shù)不同。48芯光纜指的是光纜中包含48根光纖,而大對數(shù)光纜則是指光纜中芯數(shù)超過了48芯。 在實際的光纜應用中,不同芯數(shù)的光纜需要進行不同的排序
    的頭像 發(fā)表于 03-12 10:44 ?679次閱讀

    C語言實現(xiàn)經(jīng)典排序算法概覽

    冒泡排序(英語:Bubble Sort)是一種簡單的排序算法。它重復地走訪過要排序的數(shù)列,一次比較兩個元素,如果他們的順序(如從大到小、首字母從A到Z)錯誤就把他們
    的頭像 發(fā)表于 02-25 12:27 ?472次閱讀
    C語言實現(xiàn)經(jīng)典<b class='flag-5'>排序</b><b class='flag-5'>算法</b>概覽
    主站蜘蛛池模板: 亚洲qvod图片区电影| 国产精彩视频在线| 免费视频网站嗯啊轻点| 99热在线观看精品| 忘忧草研究院一二三| 九九99热久久精品在线6| 97国产蝌蚪视频在线观看| 日本性xxx| 日日夜夜影院在线播放| 国产免费变态视频网址网站| 亚洲专区区免费| 青草影院内射中出高潮-百度| 国产精品高潮呻吟AV久久96| 又黄又粗又爽免费观看| 日本精品久久无码影院| 饥渴的新婚女教师| jizz非洲| 亚洲一二三产品区别在哪里| 秋霞电影伦网理最新在线看片| 狠狠色色综合站| 成年视频xxxxxx在线| 一本道高清不卡v免费费| 人妻换人妻AA视频| 精品国产麻豆免费人成网站| 成人网18免费韩国| 7723日本高清完整版在线观看 | 国产亚洲精品久久77777| 2021久久最新国产精品| 亚洲xxxx动漫| 入禽太深视频免费视频| 乱色欧美激惰| 国产真实露脸乱子伦| 成人性生交大片免费看4| 最近的2019中文字幕国语| 亚洲va久久久久| 熟女久久久久久久久久久| 免费亚洲视频| 久久久久久久久性潮| 国产一区二区三区内射高清 | 2020亚洲色噜噜狠狠网站| 亚洲精品天堂无码中文字幕影院|