当前位置: 首页 > news >正文

蓝桥杯算法基础(14):十大排序算法(归并排序)c语言版

归并排序

基于分而治之的思想,拿两个已经有序的序列重新组合成一个新的有序序列.

这是一个简单的合并函数,需要两个序列都有序

//默认a和b数组都是有序的
//temp为一个数组的首地址
void mergeSort(int a[],int,alen,int b[],int blen,int* temp){int i=0;int j=0;int k=0;while(i<alenj<blen){if(a[i]<b[j])//比大小,谁小先放谁在前{temp[k]=a[i];k++;i++;}else{temp[k]=b[j];k++;j++;}}while(i<alen){temp[k]=a[i];k++;//若是一方走完,还有一方剩下了,并且有序,那就意味着剩下的有序序列都比已经合并的最大的大,依次将剩余的数放到其中就行i++;}while(j<blen){temp[k]=b[j];k++;j++;}}

简洁一下代码

void mergeSort(int a[],int,alen,int b[],int blen,int* temp){int i=0;int j=0;int k=0;while(i<alenj<blen)temp[k++]=a[i]<b[j]?a[i++]:b[j++];while(i<alen)temp[k++]=a[i++];while(j<blen)temp[k++]=b[j++];}

最终版

//合并函数
//merge用于合并
void merge(int arr[],int low.int mid,int height,int* temp){//low~mid,mid+1~height分别为合并的两组int i=low;int j=mid+1;int k=low;while(i<=mid&&j<=height)temp[k++]=arr[i]<arr[j]?arr[i++]:arr[j++];while(i<=mid)temp[k++]=arr[i++];while(j<=height)temp[k++]=arr[j++];for(i=low;i<=height;i++)arr[i]=temp[i];
}//归并法,用的是分治思想,先分后治
//merge_sort用于分割
void merge_sort(int arr[],int low,int height,int *temp){//取中间位置,设为mid//low~mid为一组,mid+1~height为一组//依次以每组边界带入递归,继续分割,//直到每组只剩一个数,然后递归开始返回,//从底层开始,最终到两个有序的序列,//再将两个有序的序列合并,即得到最终排好序的序列if(low>=height)return;int mid=low+(height-low)>>1;merge_sort(arr,low,mid,temp);merge_sort(arr,mid+1,height,temp);merge(arr,low,mid,height,temp);}//mergeSort会和merge_sort和merge,并开辟temp空间
void mergeSort(int arr[],int length){int *temp=(int *)malloc(sizeof(int)*length);//向内存开辟一个length长度,sizeof(int)*length大小的空间assert(temp);//断言assert,是一个调试程序时经常使用得宏,在程序运行时,计算括号内的表达式,如果为false(0),程序将报告错误,并终止执行,若不为零,继续执行后面的语句。
//主要用于判断,是否出现了非法数据merge_sort(arr,0.length-1,temp);free(temp);//free与malloc搭配使用,一个用于开辟空间,一个用于释放空间
}
http://www.lryc.cn/news/320982.html

相关文章:

  • 力扣刷题(DAY09-DAY11)
  • IPC之管道
  • VUE-组件间通信(二)$emit
  • java 程序连接 redis 集群 的时候报错 MUTLI is currently not supported in cluster mode
  • AVP-SLAM:自动泊车系统中的语义SLAM_
  • PHP反序列化--pop链
  • 单片机中的几种周期(振动/时钟,状态,机械,指令周期)表示的含义(51为例)
  • Spring Boot+Vue前后端分离项目如何部署到服务器
  • 【学习总结】Ubuntu中vscode用ROS插件调试C++程序
  • html--蝴蝶
  • 线程的 sleep()方法和 yield()方法有什么区别?为什么 Thread 类的 sleep()和 yield ()方法是静态的?
  • Java进阶 Maven基础
  • Spring Boot(六十八):SpringBoot 整合Apache tika 实现文档内容解析
  • jQuery+CSS3自动轮播焦点图特效源码
  • 面试经典150题(114-118)
  • HTML表单标签详解:如何用HTML标签打造互动网页?
  • Web 服务器-Tomcat
  • (德迅零域)微隔离安全平台是什么,有什么作用?
  • 这些问题,每年软考报名时都有人问
  • JavaScript爬虫进阶攻略:从网页采集到数据可视化
  • MATLAB教程
  • 爱恩斯坦棋小游戏使用C语言+ege/easyx实现
  • png格式怎么转成gif?一个小窍门快速转换
  • mysql笔记:20. 什么是数据库六大范式
  • 4.GetMapping和PostMapping 和 @RequestMapping的区别。RequestBody 和ResponseBody的区别
  • UE要收费?难道ue的使用成本要增加吗?
  • 深度学习-2.6在MINST-FASHION上实现神经网络的学习流程
  • Java后端八股----JVM篇
  • 使用 C 或 C++ 扩展 Python
  • MVC接收请求教程