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

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

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

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

解析數(shù)據(jù)結(jié)構(gòu)的常用七大排序算法

C語言編程學(xué)習(xí)基地 ? 來源:C語言編程學(xué)習(xí)基地 ? 作者:C語言編程學(xué)習(xí)基地 ? 2022-03-16 08:22 ? 次閱讀

為了讓大家掌握多種排序方法的基本思想,本篇文章帶著大家對(duì)數(shù)據(jù)結(jié)構(gòu)的常用七大算法進(jìn)行分析:包括直接插入排序、希爾排序、冒泡排序、快速排序、簡(jiǎn)單選擇排序、堆排序、歸并排序等,并能夠用高級(jí)語言實(shí)現(xiàn)。

98eaffd2-a485-11ec-952b-dac502259ad0.png

希望通過對(duì)這些算法效率的比較,加深對(duì)算法的理解。

①插入排序

②折半插入排序

③選擇排序

④起泡排序

⑤快速排序

⑥希爾排序

⑦堆排序

⑧歸并排序

排序算法的分析圖解:

99096724-a485-11ec-952b-dac502259ad0.png

992d7092-a485-11ec-952b-dac502259ad0.png

994134f6-a485-11ec-952b-dac502259ad0.png

995b341e-a485-11ec-952b-dac502259ad0.png

996dc1d8-a485-11ec-952b-dac502259ad0.png

998181f0-a485-11ec-952b-dac502259ad0.png

99a67c08-a485-11ec-952b-dac502259ad0.png

用隨機(jī)數(shù)(介于1-100)產(chǎn)生10個(gè)待排序數(shù)據(jù)元素的關(guān)鍵字值)。

① 采用直接插入排序和希爾排序方法對(duì)上述待排數(shù)據(jù)進(jìn)行排序并輸出序后的有序序列;

② 采用冒泡排序、快速排序方法對(duì)上述待排數(shù)據(jù)進(jìn)行排序并輸出序后的有序序列;

③ 采用簡(jiǎn)單選擇排序、堆排序方法對(duì)上述待排數(shù)據(jù)進(jìn)行排序并輸出序后的有序序列;

④ 采用歸并排序方法對(duì)上述待排數(shù)據(jù)進(jìn)行排序并輸出排序后的有序序列;

代碼分析

頭文件:

#include#include#include
#define MAXSIZE 100
using namespace std;
typedef int KeyType;typedef int InfoType;
typedef struct{    KeyType key;    InfoType otherinfo;}RedType;
typedef struct{    RedType r[MAXSIZE+1];    int length;}SqList;

①插入排序

void InsertSort(SqList &L){    int i,j,a=0,b=0;    for(i=1;i<=L.length;++i)    {        if(L.r[i].key-1].key)        {            L.r[0]=L.r[i];            L.r[i]=L.r[i-1];            a++;        }        for(j=i-2;L.r[0].key            L.r[j+1]=L.r[j];b++;        L.r[j+1]=L.r[0];    }    cout<<"比較次數(shù):"<"移動(dòng)次數(shù):"<endl;}

99c4c80c-a485-11ec-952b-dac502259ad0.png

②折半插入排序

void BInsertSort(SqList &L){    int low,high,m;    for(int i=2;i<=L.length;++i)    {        L.r[0]=L.r[i];        low=1;high=i-1;        while(low<=high)        {            m=(low+high)/2;            if(L.r[0].key-1;            else low=m+1;        }        for(int j=i-1;j>=high+1;--j)            L.r[j+1]=L.r[j];        L.r[high+1]=L.r[0];    }}

99d5feba-a485-11ec-952b-dac502259ad0.png

③選擇排序

void SelectSort(SqList &L){    int j,k;    for(int i=1;i<=L.length;++i)    {        k=i;        for(j=i+1;j<=L.length;j++)            if(L.r[j].key        if(k!=i)        {            L.r[0].key=L.r[i].key;            L.r[i].key=L.r[k].key;            L.r[k].key=L.r[0].key;        }    }}

99f30302-a485-11ec-952b-dac502259ad0.png

④起泡排序

void BubbleSort(SqList &L){    int i,j;    for(i=1;i<=L.length;++i)    {        for(j=1;j1;++j)        {            if(L.r[j+1].key            {                L.r[0].key=L.r[j].key;                L.r[j].key=L.r[j+1].key;                L.r[j+1].key=L.r[0].key;            }        }    }}

9a029db2-a485-11ec-952b-dac502259ad0.png

⑤快速排序

int Partition(SqList &L,int low,int high){    L.r[0]=L.r[low];    KeyType pivotkey=L.r[low].key;    while(low    {        while(low=pivotkey)--high;        L.r[low]=L.r[high];        while(low        L.r[high]=L.r[low];    }    L.r[low]=L.r[0];    return low;}
void QSort(SqList &L,int low,int high){    if(low    {        int pivotloc=Partition(L,low,high);        QSort(L,low,pivotloc-1);        QSort(L,pivotloc+1,high);    }}

9a16d67e-a485-11ec-952b-dac502259ad0.png

⑥希爾排序

void ShellInsert(SqList &L,int dk){        int i,j;        for(i=dk+1;i<=L.length;++i)        {            if(L.r[i].key0]=L.r[i];            for(j=i-dk;j>0&&L.r[0].key                L.r[j+dk]=L.r[j];            L.r[j+dk]=L.r[0];            }        }}
void ShellSort(SqList &L,int dlta[],int t){    for(int k=0;k        ShellInsert(L,dlta[k]);}

9a327da2-a485-11ec-952b-dac502259ad0.png

⑦堆排序

typedef SqList HeapType;void HeapAdjust(HeapType &H,int s,int m){    RedType rc=H.r[s];int j;    for(j=2*s;j<=m;j*=2)    {        if(j1].key)++j;        if(!(rc.keybreak;        H.r[s]=H.r[j];s=j;    }    H.r[s]=rc;}void HeapSort(HeapType &H){    int i;    RedType temp;    for(i=H.length/2;i>0;--i)        HeapAdjust(H,i,H.length);    for(i=H.length;i>1;--i)    {        temp=H.r[1];        H.r[1]=H.r[i];        H.r[i]=temp;        HeapAdjust(H,1,i-1);    }

9a543316-a485-11ec-952b-dac502259ad0.png

⑧歸并排序

void Merge(RedType SR[],RedType &TR[],int i,int m,int n){    int j,k;    for(j=m+1,k=i;i<=m&&j<=n;++k)    {        if(SR[i].key<=SR[j].key)            TR[k]=SR[i++];        else            TR[k]=SR[j++];    }    int t;    if(i<=m)    {        for(t=i;t<=m;t++)            TR[k+t-i]=SR[t];    }    if(j<=n)    {        for(t=j;t<=m;t++)            TR[k+t-j]=SR[t];    }}
void MSort(RedType SR[],RedType *TR1,int s,int t){    int m;    RedType TR2[MAXSIZE+1];    if(s==t)TR1[s]=SR[s];    else{        m=(s+t)/2;        MSort(SR,TR2,s,m);        MSort(SR,TR2,m+1,t);        Merge(TR2,TR1,s,m,t);    }}void MergeSort(SqList &L){    MSort(L.r,L.r,1,L.length);}

9a6c4c8a-a485-11ec-952b-dac502259ad0.png

隨機(jī)生成函數(shù)

void RandSqList(SqList &L){    int n,max,min;    printf("輸入順序表的大小
");    cin>>n;    printf("輸入最小值和最大值
");    cin>>min>>max;    L.length=n;    printf("隨機(jī)產(chǎn)生%d個(gè)數(shù)
",n);    for(int i=1;i<=L.length;++i)    {        L.r[i].key=rand()%(max-min+1);        L.r[i].key+=min;    }    printf("順序表創(chuàng)建成功!
");}

輸出函數(shù)

結(jié)論

(1)若n較小(例如n<50),可采用直接插入排序、冒泡排序或簡(jiǎn)單選擇排序。如果記錄中的數(shù)據(jù)較多,移動(dòng)較費(fèi)時(shí)的,應(yīng)采取簡(jiǎn)單選擇排序法。

(2)若記錄的初始狀態(tài)已經(jīng)按關(guān)鍵碼基本有序,則選用直接插入排序或冒泡排序法為宜。

(3)若n較大,則應(yīng)采用改進(jìn)排序方法,如快速排序、堆排序或歸并排序法。這些排序算法的時(shí)間復(fù)雜度均為O(nlog2n),但就平均性能而言,快速排序被認(rèn)為是目前基于比較記錄關(guān)鍵碼的內(nèi)部排序中最好的排序方法,但遺憾的是,快速排序在最壞情況下的時(shí)間復(fù)雜度是O(n2),堆排序與歸并排序的最壞情況時(shí)間復(fù)雜度仍為O(nlog2n)。堆排序和快速排序法都是不穩(wěn)定的排序。若要求穩(wěn)定排序,則可選用歸并排序。

(4)基數(shù)排序可在O (d×n) 時(shí)間內(nèi)完成對(duì)n個(gè)記錄的排序,d是指單邏輯關(guān)鍵碼的個(gè)數(shù),一般遠(yuǎn)少于n。但基數(shù)排序只適用于字符串和整數(shù)這類有明顯結(jié)構(gòu)特征的關(guān)鍵碼。

(5)前面討論的排序算法,除基數(shù)排序外,都是在順序存儲(chǔ)上實(shí)現(xiàn)的。當(dāng)記錄本身的信息量很大時(shí),為避免大量時(shí)間用在移動(dòng)數(shù)據(jù)上,可以用鏈表作為存儲(chǔ)結(jié)構(gòu)。插入排序和歸并排序都易在鏈表上實(shí)現(xiàn),但有的排序方法,如快速排序和堆排序在鏈表上卻很難實(shí)現(xiàn)。

寫在最后:對(duì)于準(zhǔn)備學(xué)習(xí)C/C++編程的小伙伴,如果你想更好的提升你的編程核心能力(內(nèi)功)不妨從現(xiàn)在開始!

整理分享(多年學(xué)習(xí)的源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門教程

歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長(zhǎng)比自己琢磨更快哦!

原文標(biāo)題:知識(shí)分享:數(shù)據(jù)結(jié)構(gòu)常用 7 種排序算法(無基數(shù)排序),建議收藏

文章出處:【微信公眾號(hào):C語言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。


審核編輯:湯梓紅
聲明:本文內(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)注

    23

    文章

    4630

    瀏覽量

    93355
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4825

    瀏覽量

    69048
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    573

    瀏覽量

    40232

原文標(biāo)題:知識(shí)分享:數(shù)據(jù)結(jié)構(gòu)常用 7 種排序算法(無基數(shù)排序),建議收藏

文章出處:【微信號(hào):cyuyanxuexi,微信公眾號(hào):C語言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    數(shù)據(jù)結(jié)構(gòu)算法分析(Java版)(pdf)

    數(shù)據(jù)結(jié)構(gòu)算法分析(Java版)(pdf)http://www.ibeifeng.com/read.php?tid=4812&u=73481【中文】Java數(shù)據(jù)結(jié)構(gòu)算法中文第
    發(fā)表于 12-20 21:22

    數(shù)據(jù)結(jié)構(gòu)算法分析

    數(shù)據(jù)結(jié)構(gòu)算法分析
    發(fā)表于 06-05 10:46

    Java常用排序算法&程序員必須掌握的8大排序算法+二分法查找

    Java常用排序算法&程序員必須掌握的8大排序算法+二分法查找
    發(fā)表于 10-19 19:33

    java基礎(chǔ):Java七大外企經(jīng)典面試精講視頻

    基礎(chǔ)的Java七大外企經(jīng)典面試精講視頻,需要的朋友可以作為參考!課程目錄:1、 String Stringbuffer Stringbuilder 深度解析2、 完美回答面試題Int 與Integer的區(qū)別3
    發(fā)表于 06-29 15:00

    數(shù)據(jù)結(jié)構(gòu)的幾個(gè)重要知識(shí)點(diǎn)

    線性結(jié)構(gòu)、樹形結(jié)構(gòu)、圖狀結(jié)構(gòu),常用數(shù)據(jù)結(jié)構(gòu)有:數(shù)組、鏈表、堆棧、樹、圖等,常用
    發(fā)表于 02-27 15:01

    學(xué)習(xí)排序算法以及部分其它的數(shù)據(jù)結(jié)構(gòu)算法到底有沒有用

    這篇不是寫技術(shù)細(xì)節(jié)的,而是在之前學(xué)過的排序算法以及部分其它的數(shù)據(jù)結(jié)構(gòu)算法之后,個(gè)人的一些感覺,主要包括兩個(gè)方面:怎么去學(xué)習(xí)這些枯燥的東西?學(xué)習(xí)這個(gè)到底有沒有用?遙想當(dāng)年,在我還年輕的
    發(fā)表于 12-21 06:40

    現(xiàn)代計(jì)算機(jī)常用數(shù)據(jù)結(jié)構(gòu)算法

    本書對(duì)現(xiàn)代計(jì)算機(jī)常用數(shù)據(jù)結(jié)構(gòu)算法進(jìn)行全面而深入的介紹,系統(tǒng)地介紹了常用數(shù)據(jù)結(jié)構(gòu)和計(jì)算機(jī)算法,
    發(fā)表于 10-24 12:36 ?0次下載

    C#數(shù)據(jù)結(jié)構(gòu)算法分析_ 魏寶剛

    數(shù)據(jù)結(jié)構(gòu)算法分析》描述了各種類型的數(shù)據(jù)結(jié)構(gòu),包括線性表、樹、堆、圖,以及查找、排序算法。自始至終將
    發(fā)表于 12-15 16:46 ?0次下載
    C#<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>和<b class='flag-5'>算法</b>分析_ 魏寶剛

    數(shù)據(jù)結(jié)構(gòu)算法

    全國(guó)C語言考試公共基礎(chǔ)知識(shí)點(diǎn)——數(shù)據(jù)結(jié)構(gòu)算法,該資料包含了有關(guān)數(shù)據(jù)結(jié)構(gòu)算法的全部知識(shí)點(diǎn)。
    發(fā)表于 03-30 14:27 ?0次下載

    數(shù)據(jù)結(jié)構(gòu)常見的八大排序算法

    本文總結(jié)了數(shù)據(jù)結(jié)構(gòu)常見的八大排序算法。詳細(xì)分析請(qǐng)看下文
    發(fā)表于 02-05 15:26 ?1846次閱讀
    <b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>常見的八<b class='flag-5'>大排序</b><b class='flag-5'>算法</b>

    大牛分享平時(shí)如何學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)算法

    數(shù)據(jù)結(jié)構(gòu)算法的地位對(duì)于一個(gè)程序員來說不言而喻。今天這篇文章不是來勸你們學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)算法的,也不是來和你們說數(shù)據(jù)結(jié)構(gòu)
    的頭像 發(fā)表于 11-02 11:25 ?3019次閱讀

    程序員的內(nèi)功:C語言八大排序算法

    一 前言 如果說各種編程語言是程序員的招式,那么數(shù)據(jù)結(jié)構(gòu)算法就相當(dāng)于程序員的內(nèi)功。 想寫出精煉、優(yōu)秀的代碼,不通過不斷的錘煉,是很難做到的。 二 八大排序算法
    的頭像 發(fā)表于 10-26 10:33 ?2155次閱讀
    程序員的內(nèi)功:C語言八<b class='flag-5'>大排序</b><b class='flag-5'>算法</b>

    算法數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)知識(shí)分享(上)

    有哪些常見的數(shù)據(jù)結(jié)構(gòu)?基本操作是什么?常見的排序算法是如何實(shí)現(xiàn)的?各有什么優(yōu)缺點(diǎn)?本文簡(jiǎn)要分享算法基礎(chǔ)、常見的數(shù)據(jù)結(jié)構(gòu)以及
    的頭像 發(fā)表于 04-06 16:48 ?835次閱讀
    <b class='flag-5'>算法</b>和<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>基礎(chǔ)知識(shí)分享(上)

    算法數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)知識(shí)分享(中)

    有哪些常見的數(shù)據(jù)結(jié)構(gòu)?基本操作是什么?常見的排序算法是如何實(shí)現(xiàn)的?各有什么優(yōu)缺點(diǎn)?本文簡(jiǎn)要分享算法基礎(chǔ)、常見的數(shù)據(jù)結(jié)構(gòu)以及
    的頭像 發(fā)表于 04-06 16:48 ?647次閱讀
    <b class='flag-5'>算法</b>和<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>基礎(chǔ)知識(shí)分享(中)

    算法數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)知識(shí)分享(下)

    有哪些常見的數(shù)據(jù)結(jié)構(gòu)?基本操作是什么?常見的排序算法是如何實(shí)現(xiàn)的?各有什么優(yōu)缺點(diǎn)?本文簡(jiǎn)要分享算法基礎(chǔ)、常見的數(shù)據(jù)結(jié)構(gòu)以及
    的頭像 發(fā)表于 04-06 16:48 ?789次閱讀
    <b class='flag-5'>算法</b>和<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>基礎(chǔ)知識(shí)分享(下)
    主站蜘蛛池模板: 天天干天天看 | 中国videos偷窥 | 中国成人免费视频 | 国产一区二区三区影院 | 在线观看黄色的网站 | 台湾香港澳门三级在线 | 四虎国产精品永久在线播放 | 超级淫小黄文大全很污的那种 | 亚洲精品视频专区 | 5252欧美在线观看 | 天堂在线观看中文字幕 | 婷婷丁香亚洲 | 港台无码 | 色噜噜噜噜噜 | 一级特色黄色片 | 边做边爱在线观看视频免费 | 国产成人夜间影院在线观看 | 色多多网站在线观看 | 日韩欧美色 | 国产色视频一区 | 老司机狠狠k免费毛片 | 欧美色视频网站 | 韩国三级久久精品 | 色噜噜狠狠狠狠色综合久一 | 日日噜噜爽爽狠狠视频 | 亚洲人成电影在线小说网色 | 看免费黄色大片 | 成人夜色| 色多多视频官网 | 丁香五香天堂网 | 奇米色影院 | 国产高清一级视频在线观看 | 欧美二区三区 | 天天色综合三 | 久久网站免费观看 | 四虎最新网 | 婷婷综合五月 | 麒麟色欧美影院在线播放 | 国产婷婷色一区二区三区 | 五月天亚洲婷婷 | 最新欧美精品一区二区三区 |