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

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

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

为了让大家掌握多种排序方法的基本思想,本篇文章带着大家对数据结构的常用七大算法进行分析:包括直接插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序等,并能够用高级语言实现。希望通过对这些算法效率的比较,加深对算法的理解。①插入排序②折半插入排序③选择排序④起泡排序⑤快速排序⑥希尔排序⑦堆排序⑧归并排序排序算法的分析图解:用随机数产生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的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!

    推荐阅读
  • 数据驱动原理及讲解(什么是数据驱动设计)

    在设计过程中,设计决策是基于数据和用户行为研究的。通过数据驱动设计,以提升用户体验,被证实是切实可行的方法。因此数据实际上只是一种衡量标准。我们仍然要对成因的重要程度做出判决。定量数据能显示程度,而不能说明原因。测试的主要目标是在同等条件下,对不同变量进行比较。一个好的调研需要精心设计好问题,确保问题没有引导性,并且目的明确。

  • 菊花水变绿了能喝么(菊花水发绿还能喝吗)

    此外,一杯水放入三、四朵菊花中即可,避免菊花茶浓度过高。

  • 官方报纸如何排版(第七十四式Word也能制作报纸)

    ①插入文本框,对文本框大小及位置进行设计;②标记文本框的内容,进行相应的调整;2、输入文字,插入图片。②选择文本框,调整对齐方式。我们将在第一时间帮助您解决。征集:征集20例Word实际操作案例,比如说:这个简历怎么做出来的?Word怎么做出美观的日历?

  • 桃怎么种(桃的种植方法)

    病虫害防治桃树的抗性很强,最常见的及时果树流胶、炭疽病以及蛀心虫,果树流胶对果树的生长年限以及果树的产量都有极大的影响,是非常严重的一种病害,我们可以用溃腐灵加上适量的有机硅刷一到两次即可,而且每年清园的时候进行全方面的溃腐灵喷洒。炭疽病可以用波尔多液进行防治,至于蛀心虫最好是使用黑光灯进行诱杀,如果虫害太阳中可以适量的使用敌百虫进行防治。

  • 宣传部是干什么的呢 宣传部具体干什么呢

    宣传部是主管形态方面工作的综合职能部门,负责抓好新闻中心工作、分管新闻科;负责抓好广播电视工作;负责抓好讲师团工作;负责宣传部政工工作,分管理论科;负责抓好文联工作,分管文艺科;负责抓好社会宣传工作,分管宣传科;负责抓好文明创建工作,分管文明办。

  • 竹子里的酒怎么回事(都有哪些种的步骤)

    下面希望有你要的答案,我们一起来看看吧!竹子里的酒怎么回事先酿酒,酒就是包谷酒和些烧酒类的低度数的酒。选竹子,一般会找那些一到两年的竹子,因为太小的竹子还在生长期,而太老的竹子打的孔它很难自愈。原始的方法还有,就是打的孔要稍微大一点,往里面灌酒,灌满后用竹子削成的竹栓把它封住就行了。经过竹子成长,酒在竹腔内吸收竹子的营养成分。经过竹子的天然净化,酒中对人体有害成分大大减少。

  • 2022聊城夏季高考外语听力考试成绩查询方式

    查询时间:山东省2022年夏季高考外语听力考试成绩定于2月21日上午10:00开放查询。成绩复核:考生对本人考试成绩如有疑义,可在成绩正式公布次日起3个工作日内,由本人携带居民身份证和准考证前往参加考试地县(市、区)招生考试机构,提出成绩复核申请,逾期不予受理。

  • vivoz5怎么调屏幕分辨率(vivoz5屏幕分辨率条件方法介绍)

    以下内容大家不妨参考一二希望能帮到您!vivoz5怎么调屏幕分辨率点击打开手机上的“设置”菜单,进入设置里面后点击“显示与亮度”选项。vivo是一家全球性的移动互联网智能终端公司,致力于为消费者打造拥有极致拍照、畅快游戏、Hi-Fi音乐的智能手机产品。当季的明星产品主要有vivoXiQOONEX3S、vivoZvivoS5等。

  • 新能源车销量排行特斯拉(8月新能源车销量前30)

    ModelY超越宏光MINI重夺新能源车市场销量冠军,8月销量为6.2万辆,同比增长110.4%;宏光MINI则以4.9万辆成绩排名第2,同比增长19.3%;而比亚迪宋DM则仍排名第3名,8月销量为3.7万辆。销量排名前十里,比亚迪占6席。而销量前二十中比亚迪秦PLUSEV、比亚迪驱逐舰05、比亚迪唐DM则排在第11、16、19名。且前三十中仅Model3、科莱威同比下降,Model3同比下降超4成。大众ID.4X和ID.6CROZZ分别取得了4409辆和3831辆的成绩。

  • 宣纸的特性和分类(宣纸的分类优势)

    宣纸分为三种:生宣,熟宣,半生半熟宣1.生宣特点:墨迹自开,层次分明,适宜:行草书和写意山水。