c语言排序算法

更新时间:2023-04-16 08:04:45 阅读: 评论:0


2023年4月16日发(作者:四环素类)

C语⾔归并排序(合并排序)算法及代码

归并排序也称合并排序,其算法思想是将待排序序列分为两部分,依次对分得的两个部分再次使⽤归并排序,之后再对其进⾏合并。仅从算

法思想上了解归并排序会觉得很抽象,接下来就以对序列A[0],A[l]…,A[n-1]进⾏升序排列来进⾏讲解,在此采⽤⾃顶向下的实现⽅法,操作步骤如下。

(1)将所要进⾏的排序序列分为左右两个部分,如果要进⾏排序西游记好词佳句 的序列的起始元素下标为first,最后⼀个元素的下标为last,那么左右两部分

之间的临界点下标mid=(first+last)/2,这两部分分别是A[first…mid]和A[mid+1…last]。

(2)将上⾯所分得的两部分序列继续按照步骤(1)继续进⾏划分,直到划分的区间长度为1。

(3)将划分结束后的序列进⾏归并排序,排序⽅法为对所分的n个⼦序列进⾏两两合并,得到n/2或n/2+l个含有两个元素的⼦序列,再对得到

的⼦序列进⾏合并,直⾄得到⼀个长度为n的有序序列为⽌。下⾯通过⼀段代码来看如何实现归并排序。

#include

#include

#defineN7

voidmerge(intarr[],intlow,intmid,inth书法名人 igh){

inti,k;

int*tmp=(int*)malloc((high-low+1)*sizeof(int));

//申请空间,使其⼤⼩为两个

intleft_low=low;

intleft_high=mid;

intright_low=mid+1;

intright_high=high;

for(k=0;left_low<=left_high&&right_low<=right_high;k++){//⽐较两个指针所指向的元素

if(arr[left_low]<=arr[right_low]){

tmp[k]=arr[left_low++];

}el{

tmp[k]=arr[right_low++];

}}

if(left_low<=left_high){//若第⼀个序列有剩余,直接复制出来粘到合并序列尾

//memcpy(tmp+k,arr+left_low,(left_high-left_low+l)*sizeof(int));

for(i=left_low;i<=left_high;i++)

tmp[k++]=arr[i];}

if(right_low<=right_high){

//若第⼆个序列有西汉史 剩余,直接复制出来粘到合并序列尾

//memcpy(tmp+k,arr+right_low,(right_high-right_low+1)*sizeof(int));

for(i=right_low;i<=right_high;i++)

tmp[k++]=arr[i];}

for(i=0;i

arr[low+i]=tmp[i];

free(tmp);

return;}

voidmerge_sort(intarr[],经常梦到前男友是怎么回事 unsignedintfirst,unsignedintlast){

intmid=0;

if(first

mid=(first+last)/2;/*注意防⽌溢出*/

/*mid=first/2+last/2;*/

//mid=(first&last)+((first^last)>>1);

merge_sort(arr,first,mid);

merge_sort(arr,mid+1,last);

merge(arr,first,mid,last);}

return;}

intmain(){

inti;

inta[N]={32,12,56,78,76,45,36};

printf("排序前n");

for(吃午饭英语怎么说 i=0;i

printf("%dt",a[i]);

merge_sort(a,0,N-1);//排序

printf("n排序后n");

for(i=0;i

printf("%dt",a[i查个人社保 ]);printf("n");

s英雄联盟进不去 ystem("pau");

return0;}

运⾏结果:

排序前

326排序后

678

分析上⾯的运⾏结果,通过归led电视机 并排序成功地实现了对给定序列的排序操作。接下来通过图11-9来了解归并排序的具体操作流程。

在图11-9中,孕妇吃黑芝麻 先对所要进⾏排序的序列进⾏分解,直到分为单个元素为⽌,然后将其进⾏两两合并。由于最终分解成单个元素,因此在合并

的时候.将⼩数放在前⾯,⼤数放在后⾯,得到⼀个有序序列。接下来对两个相连的有序序列进⾏排序,先⽐较有序序列中的第⼀个元素,将

较⼩的元素放⼊临时数组中,接着将较⼩元素所在数组的下⼀个元素与另⼀个数组中的较⼩元素⽐较,同样将较⼩元素放⼊临时数组中,依次进⾏,直到两个数组的所有元素都放⼊临时数组中,最后再将临时数组的元素放⼊原始数组中的对应位置。

图11-9归并排序的操作流程


本文发布于:2023-04-16 08:04:45,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/832734.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:我国法律体系
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图