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

大连网站建设免费外链网站

大连网站建设,免费外链网站,网站建设推广文案,wordpress 浮动按钮归并排序思想: 归并排序可以解释为是将放在数组里的一串数字进行拆分,拆分之后再判断大小合并的过程,每次都是从中间位置拆分,例如有七个数,第一次拆分就将它们分成前三个数为一个数组,后四个数为一个数组&…

归并排序思想:

       归并排序可以解释为是将放在数组里的一串数字进行拆分,拆分之后再判断大小合并的过程,每次都是从中间位置拆分,例如有七个数,第一次拆分就将它们分成前三个数为一个数组,后四个数为一个数组,我们拆分之后在堆区开辟空间来存放这两个数组,将拆分的两个数组按照第一次拆分一样的方法对它俩再进行拆分,直到每个数组里面都只有一个元素就结束;拆分之后从最后往前依次判断合并。

 

#include <stdio.h>
#include <stdlib.h>
void sort(int *a,int n);   //拆分
void merge(int *a,int *left,int leftlen,int *right,int rightlen); //合并
void show(int *a,int n);
int main(int argc, char *argv[])
{ int a[10] = {5,46,12,34,55,9,48,79,23,10};puts("排序前:");show(a,10);sort(a,10);puts("排序后:");show(a,10);return 0;
} 
void merge(int *a,int *left,int leftlen,int *right,int rightlen) //合并
{int i=0; //左边数组的下标int j=0; //右边数组的下标int k=0; //归并数组的下标while(leftlen>i && rightlen>j){if(left[i]<right[j])    //从小到大排列合并{a[k++] = left[i++];}elsea[k++] = right[j++];}if(leftlen>i)   //如果右边数组拿完左边数组还有,就将剩下的全部放入合并数组{a[k++] = left[i++];}if(rightlen>j)  //反之{a[k++] = right[j++];}
}
void sort(int *a,int n)   //拆分
{if(n<2)    //递归终止条件,当数组中元素只有一个时就结束return;int mid = n/2; //求中间值int *left = (int *)malloc(sizeof(int)*mid);      //开存放拆分数据的空间int *right = (int *)malloc(sizeof(int)*(n-mid));for(int i=0;i<mid;i++)  //将a左边的数据存入left{left[i] = a[i];}for(int j=mid;j<n;j++)  //将a右边的数据存入right{right[j-mid] = a[j];}sort(left,mid);     //将left中的数再进行拆分sort(right,n-mid);  //将right中的数据再进行拆分merge(a,left,mid,right,n-mid);free(left);         //释放空间free(right);
}
void show(int *a,int n)
{for(int i=0;i<n;i++){printf("%d ",a[i]);}puts("");
}

解析:在上述思想中我们提到了对不同的数组做同样的操作,因此这里就可以通过使用递归函数来实现;我们将代码分为两个函数来写,一个是拆分函数,另一个是合并函数:

拆分函数:

       拆分函数我们需要传进去的参数为数组元素首地址和数组长度,既然拆分函数为递归函数,那我们就需要有结束条件,在这里结束条件就为数组长度n为1时就结束;拆分首先是找到数组中间的元素下标,从中间拆分为左右两个数组,根据左右数组长度来开辟对应大小的空间,开辟完空间之后将左右数组元素存入到空间中,存入之后再调用拆分函数自己,将左右函数的元素首地址和长度当做参数传入,这样就可以再次对函数进行拆分,拆分结束之后就是合并函数;

合并函数:

       合并函数需要传入的参数有五个,第一个就是原来需要拆分的数组的首地址,用来存放合并后的元素,后面四个参数分别是左边数组的元素首地址、左边数组的长度、右边数组的元素首地址、右边数组的长度;在合并函数里面我们首先需要定义三个变量分别来代表左边数组的元素下标、右边数组的元素下标和合并数组的元素下标;在合并的时候只要左右两边数组都有元素,就需要进行判断大小,于是循环表达式为leftlen>i && rightlen>j;在比较完之后就是将数存入合并数组,存入哪个数组的数就让对应数组的下标自加1,这样下次就能判断下一个数,直到有一边数组中的元素被全部拿出存入到合并数组就结束循环判断,这时需要判断左右数组中是否有剩余的元素,有的话依次存入到合并数组中;

       合并函数写完之后我们就可以在拆分函数中调用它,在左右数组拆分完之后就调用合并函数进行合并,合并完成之后还有一件事宝子们不要忘啦,那就是释放空间,因为存放左右数组元素的空间是我们自己开辟的堆区空间,所以需要我们自己释放。释放之后排序也就结束了,最后再循环遍历一下原数组就可以看到已经排好序啦。

 

http://www.hengruixuexiao.com/news/25155.html

相关文章:

  • 富库网站建设谷歌官网注册入口
  • 赣州做网站推广seo推广策划
  • 射洪网站建设最全bt搜索引擎
  • 电脑记事本做网站百度如何优化
  • spark网站开发seo的作用
  • 微信订阅号网站开发湖南网站建设seo
  • wordpress时间函数seo专业培训中心
  • 重庆做网站的公司问卷调查网站
  • 哈尔滨房地产网站建设海外品牌推广
  • 网站文件上传wordpress修改今日热点头条新闻
  • 苏州公司网站建设找哪家域名注册需要多少钱?
  • 网站开发找哪家兰州网络推广优化服务
  • 广州在线图文网络科技中心网站建设百度推广账户登陆
  • 2020年购物app排行石家庄seo公司
  • 上海网站设计公司联系方式杭州seo优化公司
  • 广州家电维修网站建设怎么注册网站免费的
  • 深达网站制作深圳公司注册自己的网站
  • 学网站开发和游戏开发那个在线搜索资源
  • 评论 wordpressseo关键词的优化技巧
  • 合肥建设局网站首页百度域名查询
  • 网页设计与网站组建seo 什么意思
  • 湖南对外建设集团网站今日新闻最新
  • 出入长春最新通知今天shopify seo
  • wordpress做的外贸网站常见的网站推广方式有哪些
  • 自己做捕鱼网站能不能挣钱每日关键词搜索排行
  • oa做软件还是网站百度指数查询官网入口
  • 注册个网站域名多少钱一年百度推广如何获取精准的客户
  • 网站建设内容是经营项目吗我也要投放广告
  • 设计师 网站软文营销的经典案例
  • 2 网站建设的一般步骤包含哪些中国婚恋网站排名