0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

解析数据结构的常用七大排序算法

C语言编程学习基地 来源:C语言编程学习基地 作者:C语言编程学习基地 2022-03-16 08:22 次阅读

为了让大家掌握多种排序方法的基本思想,本篇文章带着大家对数据结构的常用七大算法进行分析:包括直接插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序等,并能够用高级语言实现。

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

希望通过对这些算法效率的比较,加深对算法的理解。

①插入排序

②折半插入排序

③选择排序

④起泡排序

⑤快速排序

⑥希尔排序

⑦堆排序

⑧归并排序

排序算法的分析图解:

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

用随机数(介于1-100)产生10个待排序数据元素的关键字值)。

① 采用直接插入排序和希尔排序方法对上述待排数据进行排序并输出序后的有序序列;

② 采用冒泡排序、快速排序方法对上述待排数据进行排序并输出序后的有序序列;

③ 采用简单选择排序、堆排序方法对上述待排数据进行排序并输出序后的有序序列;

④ 采用归并排序方法对上述待排数据进行排序并输出排序后的有序序列;

代码分析

头文件:

#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<<"比较次数:"<"移动次数:"<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

随机生成函数

void RandSqList(SqList &L){    int n,max,min;    printf("输入顺序表的大小
");    cin>>n;    printf("输入最小值和最大值
");    cin>>min>>max;    L.length=n;    printf("随机产生%d个数
",n);    for(int i=1;i<=L.length;++i)    {        L.r[i].key=rand()%(max-min+1);        L.r[i].key+=min;    }    printf("顺序表创建成功!
");}

输出函数

结论

(1)若n较小(例如n<50),可采用直接插入排序、冒泡排序或简单选择排序。如果记录中的数据较多,移动较费时的,应采取简单选择排序法。

(2)若记录的初始状态已经按关键码基本有序,则选用直接插入排序或冒泡排序法为宜。

(3)若n较大,则应采用改进排序方法,如快速排序、堆排序或归并排序法。这些排序算法的时间复杂度均为O(nlog2n),但就平均性能而言,快速排序被认为是目前基于比较记录关键码的内部排序中最好的排序方法,但遗憾的是,快速排序在最坏情况下的时间复杂度是O(n2),堆排序与归并排序的最坏情况时间复杂度仍为O(nlog2n)。堆排序和快速排序法都是不稳定的排序。若要求稳定排序,则可选用归并排序。

(4)基数排序可在O (d×n) 时间内完成对n个记录的排序,d是指单逻辑关键码的个数,一般远少于n。但基数排序只适用于字符串和整数这类有明显结构特征的关键码。

(5)前面讨论的排序算法,除基数排序外,都是在顺序存储上实现的。当记录本身的信息量很大时,为避免大量时间用在移动数据上,可以用链表作为存储结构。插入排序和归并排序都易在链表上实现,但有的排序方法,如快速排序和堆排序在链表上却很难实现。

写在最后:对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

原文标题:知识分享:数据结构常用 7 种排序算法(无基数排序),建议收藏

文章出处:【微信公众号:C语言编程学习基地】欢迎添加关注!文章转载请注明出处。


审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4449

    浏览量

    90723
  • 代码
    +关注

    关注

    30

    文章

    4553

    浏览量

    66665
  • 数据结构
    +关注

    关注

    3

    文章

    560

    浏览量

    39898

原文标题:知识分享:数据结构常用 7 种排序算法(无基数排序),建议收藏

文章出处:【微信号:cyuyanxuexi,微信公众号:C语言编程学习基地】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    数据结构算法分析(Java版)(pdf)

    数据结构算法分析(Java版)(pdf)http://www.ibeifeng.com/read.php?tid=4812&u=73481【中文】Java数据结构算法中文第
    发表于 12-20 21:22

    数据结构算法分析

    数据结构算法分析
    发表于 06-05 10:46

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

    Java常用排序算法&程序员必须掌握的8大排序算法+二分法查找
    发表于 10-19 19:33

    java基础:Java七大外企经典面试精讲视频

    基础的Java七大外企经典面试精讲视频,需要的朋友可以作为参考!课程目录:1、 String Stringbuffer Stringbuilder 深度解析2、 完美回答面试题Int 与Integer的区别3
    发表于 06-29 15:00

    【下载】《嵌入式系统软件设计中的数据结构

    教学参考书。内容简介  根据嵌入式系统软件设计需要的“数据结构”知识编写而成。书中基本内容有:常用线性数据结构在嵌入式系统中的实现和相关算法;树和图在嵌入式系统中的实现和相关
    发表于 11-30 17:46

    数据结构的几个重要知识点

    线性结构、树形结构、图状结构常用数据结构有:数组、链表、堆栈、树、图等,常用
    发表于 02-27 15:01

    学习排序算法以及部分其它的数据结构算法到底有没有用

    这篇不是写技术细节的,而是在之前学过的排序算法以及部分其它的数据结构算法之后,个人的一些感觉,主要包括两个方面:怎么去学习这些枯燥的东西?学习这个到底有没有用?遥想当年,在我还年轻的
    发表于 12-21 06:40

    现代计算机常用数据结构算法

    本书对现代计算机常用数据结构算法进行全面而深入的介绍,系统地介绍了常用数据结构和计算机算法
    发表于 10-24 12:36 0次下载

    C#数据结构算法分析_ 魏宝刚

    数据结构算法分析》描述了各种类型的数据结构,包括线性表、树、堆、图,以及查找、排序算法。自始至终将
    发表于 12-15 16:46 0次下载
    C#<b class='flag-5'>数据结构</b>和<b class='flag-5'>算法</b>分析_ 魏宝刚

    数据结构算法

    全国C语言考试公共基础知识点——数据结构算法,该资料包含了有关数据结构算法的全部知识点。
    发表于 03-30 14:27 0次下载

    数据结构常见的八大排序算法

    本文总结了数据结构常见的八大排序算法。详细分析请看下文
    发表于 02-05 15:26 1755次阅读
    <b class='flag-5'>数据结构</b>常见的八<b class='flag-5'>大排序</b><b class='flag-5'>算法</b>

    程序员的内功:C语言八大排序算法

    一 前言 如果说各种编程语言是程序员的招式,那么数据结构算法就相当于程序员的内功。 想写出精炼、优秀的代码,不通过不断的锤炼,是很难做到的。 二 八大排序算法
    的头像 发表于 10-26 10:33 1851次阅读
    程序员的内功:C语言八<b class='flag-5'>大排序</b><b class='flag-5'>算法</b>

    算法数据结构基础知识分享(上)

    有哪些常见的数据结构?基本操作是什么?常见的排序算法是如何实现的?各有什么优缺点?本文简要分享算法基础、常见的数据结构以及
    的头像 发表于 04-06 16:48 577次阅读
    <b class='flag-5'>算法</b>和<b class='flag-5'>数据结构</b>基础知识分享(上)

    算法数据结构基础知识分享(中)

    有哪些常见的数据结构?基本操作是什么?常见的排序算法是如何实现的?各有什么优缺点?本文简要分享算法基础、常见的数据结构以及
    的头像 发表于 04-06 16:48 385次阅读
    <b class='flag-5'>算法</b>和<b class='flag-5'>数据结构</b>基础知识分享(中)

    算法数据结构基础知识分享(下)

    有哪些常见的数据结构?基本操作是什么?常见的排序算法是如何实现的?各有什么优缺点?本文简要分享算法基础、常见的数据结构以及
    的头像 发表于 04-06 16:48 546次阅读
    <b class='flag-5'>算法</b>和<b class='flag-5'>数据结构</b>基础知识分享(下)