77百科网
当前位置: 首页 生活百科

数据结构常见排序算法(知识分享数据结构常用)

时间:2023-07-29 作者: 小编 阅读量: 4 栏目名: 生活百科

为了让大家掌握多种排序方法的基本思想,本篇文章带着大家对数据结构的常用七大算法进行分析:包括直接插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序等,并能够用高级语言实现。希望通过对这些算法效率的比较,加深对算法的理解。①插入排序②折半插入排序③选择排序④起泡排序⑤快速排序⑥希尔排序⑦堆排序⑧归并排序排序算法的分析图解:用随机数产生10个待排序数据元素的关键字值)。

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

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

①插入排序

②折半插入排序

③选择排序

④起泡排序

⑤快速排序

⑥希尔排序

⑦堆排序

⑧归并排序

排序算法的分析图解:

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

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

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

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

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

代码分析

头文件:

#include<cstdio>#include<iostream>#include<cstdlib>#define MAXSIZE 100using 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<L.r[i-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].key;--j)L.r[j 1]=L.r[j];b;L.r[j 1]=L.r[0];}cout<<"比较次数:"<<a<<"移动次数:"<<b<<endl;}

②折半插入排序

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<L.r[m].key)high=m-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];}}

③选择排序

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<L.r[k].key)k=j;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;}}}

④起泡排序

void BubbleSort(SqList &L){int i,j;for(i=1;i<=L.length;i){for(j=1;j<L.length-i 1;j){if(L.r[j 1].key<L.r[j].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;}}}}

⑤快速排序

int Partition(SqList &L,int low,int high){L.r[0]=L.r[low];KeyType pivotkey=L.r[low].key;while(low<high){while(low<high&&L.r[high].key>=pivotkey)--high;L.r[low]=L.r[high];while(low<high&&L.r[low].key<=pivotkey)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<high){int pivotloc=Partition(L,low,high);QSort(L,low,pivotloc-1);QSort(L,pivotloc 1,high);}}

⑥希尔排序

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

⑦堆排序

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(j<m&&H.r[j].key<H.r[j 1].key)j;if(!(rc.key<H.r[j].key))break;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);}

⑧归并排序

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];elseTR[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);}

随机生成函数

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

输出函数

void Output(SqList L){printf("输出:\n");for(int i=1;i<=L.length;i)cout<<"data"<<"["<<i<<"]"<<": "<<L.r[i].key<<endl;}

结论

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

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

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

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

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

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

编程学习书籍分享:

编程学习视频分享:

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

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

对于C/C感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些C/C的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!

    推荐阅读
  • pq pv 区别(专业术语QPSTPS)

    TPSTransactionsPerSecond的缩写,每秒处理的事务数目。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数,最终利用这些信息作出的评估分。用户对同一页面的多次刷新,访问量累计。如果用户不断更换IP,则有可能被多次统计。某个并发用户数下单位时间内能处理的最大的请求数,称之为最大吞吐率。有人把RPS说等效于QPS。

  • 红旗h5油电混合纯电续航(红旗纯电H5曝光)

    新华社此前报道称,一汽红旗蔚山工厂5月1日启动每小时50辆生产节拍,仅用5天时间就实现红旗日产爬坡至1160辆。到5月底,一汽红旗蔚山工厂拼出了月产约4.31万辆的成绩,创历史新高,其中红旗品牌完成约3.18万辆,超额完成生产目标。网上车市消息称,红旗蔚山工厂将投产一款代号为E001的新车型,产品名称为红旗纯电H5,将作为品牌电驱化重点车型推向市场。新车动力上,红旗纯电H5将搭载111kWh动力电池。

  • 阳春三月你好百花争艳(阳春三月春意闹)

    下面更多详细答案一起来看看吧!阳春三月你好百花争艳安康恒大御景半岛复工复产忙不停[打call],作为小业主,今天我更喜欢施工现场的这些[心]

  • 苹果手机听筒进水了怎么办(苹果手机听筒进水了解决方法)

    跟着小编一起来看一看吧!苹果手机听筒进水了怎么办用干净的细毛牙刷刷听筒上的金属网,刷了几次以后基本正常了。没干的话用小吸尘器或者电吹风周围包起来反过来吸,吹干就好。手机进水严重不仅仅是听筒故障,还会导致手机内元件遇水短路,如果是酸碱等腐蚀性液体会腐蚀主板元件,或者与主板上进行产生化学反应,影响正常使用。建议您及时把手机送到苹果官方维修点进行专业检测与维修!

  • 湖人队球员交易最新情况(湖人选中交易掉的29号秀)

    道格拉斯的NBA之路并不顺畅,充满曲折。对于NBA来说,道格拉斯的选秀年纪偏大,天赋不高,上限低,没有培养价值。因为这些原因他在NBA越混越差,越打越没有信心,30岁就成NBA边缘人。但到了水平较低的联赛,有过丰富NBA履历的道格拉斯,又成了大腿级别的核心人物,拥有大量上场时间和出手权,球队也对他足够重视,给了他很多自由发挥的空间。

  • 买斗鱼的小技巧(购买挑选斗鱼的方法)

    买斗鱼的小技巧在挑选斗鱼之前一定要做好挑选的准备工作,了解掌握斗鱼的基本形态特征已经挑选的方法和技巧。选择身体没有伤疤,各个鱼鳍完整无破损、尾巴完好的斗鱼。当然在挑选斗鱼的时候,应该选择正规、信誉好的水族点进行购买。同时还可以邀请专业的水族饲养专家,陪同前往进行选购,以保证自己能挑选到健康优质的斗鱼。斗鱼是一种十分有趣的鱼种,因为它的好斗而得名。

  • 刚换的刹车片吱吱响(了解一下)

    刚换的刹车片吱吱响刹车片过硬颗粒大而造成的响声。刹车盘不平有槽而与刹车片而摩擦产生的响声。刹车的工作原理主要是来自摩擦,利用刹车片与刹车碟(鼓)及轮胎与地面的摩擦,将车辆行进的动能转换成摩擦後的热能,将车子停下来。

  • 华容县免费孕检指南(华容县妇幼保健计划生育服务中心)

    华容县孕前免费检查免费孕检医院:华容县妇幼保健院所需证件:1、夫妻双方身份证原件、复印件2、夫妻双方户口本复印件3、结婚证什么时候可做孕前优生检查?一周后,检查对象可通过手机微信公众号自行查询结果一周后到户籍所在的乡镇卫生院领取评估告知书。做完孕前优生检查当天,便可拿孕前优生检查证明到所在村或居委会妇女主任那里填表盖章,再到乡镇计生办领取生育服务登记证啦!

  • 情人之间能相处多久才算真爱(情人之间有这三种感觉)

    当两个人真正相爱的时候,心里总是会控制不住想念对方。02情人之间,总会有“保护”的感觉两个真正相爱着的人,不会让对方受到一点点伤害。自己不会伤害对方,也不允许别人伤害对方,自己会在身体上和心理上,默默地保护着心爱的那个人。情人之间,互相会勇敢地保护对方。保护对方的尊严,保护对方的快乐,保护对方的真心。只有彼此互相保护,才能让这份感情更加牢不可破。

  • 战魂铭人推荐角色(铭人角色推荐)

    工程师-奥莉强度上限最高,首个双形态角色,分为人形态和机甲形态变身之后攻击方式是发射榴弹炮,现在小编就来说说关于战魂铭人推荐角色?暴击伤害最高,连招和位移灵活。唯一的射手,手长的同时伤害还高,唯一也灵活。利用技能聚怪,然后无脑平A就行了,会闪避就能秀翻全场。移动城堡-杰拉尔。对新手最友好的角色,有治疗技能,有护盾格挡伤害,重击的伤害也非常可观,还有两个召唤天使的技能。