mergesort求归并排序算法!

mergesort  时间:2021-06-26  阅读:()

用2路归并排序法对N个元素进行排序,用C+++语言

2路归并排序法?你是指merge sort?C+++是什么语言? templatevoid merge(T a[],int i,int j,int k){ int b=i,c=j+1,d=0; T *temp=new T[k-i+1]; while(b<=j&&c<=k){ if(a[b]void msort(T a[],int i,int j){ if(j-i<0) return; else{ int mid=(i+j)/2; msort(a,i,mid); msort(a,mid+1,j); merge(a,i,mid,j); } } template void merge_sort(T a[],int n){ msort(a,0,n-1); }

数据结构 归并排序

展开全部 程序代码:#include int *a=new int[20]; int n=0; //归并排序,排序结果放到了b[]中 void Merge(int a[],int b[],int left ,int mid,int right)//此处的right指向数组中左后一个元素的位置 { int i=left; int j=mid+1; int k=left; while(i<=mid&&j<=right) { if(a[i]<=a[j])b[k++]=a[i++]; else b[k++]=a[j++]; } while(i<=mid)b[k++]=a[i++]; while(j<=right)b[k++]=a[j++]; }//从b[]中又搬到了a[]中 void Copy(int a[],int b[],int left,int right)//right同上 { for(int i=left;i<=right;i++) a[i]=b[i]; }//划分并排序 void MergeSort(int a[],int left,int right)//同上 { int *b = new int[right+1]; if(left { //将当前传经来的数组划分成更小的大小几乎相同的数组 int i=(left+right)/2; MergeSort(a,left,i); MergeSort(a,i+1,right); //将小数组合成大数组,同时排序,结果放到b[]中 Merge(a,b,left,i,right); //从b[]中挪到a[]中 Copy(a,b,left,right); } }void Input() { cout< cin>>n; cout< for(int i=0;i cin>>a[i]; //调用算法 MergeSort(a,0,n-1); }void Output() { for(int i=0;i cout< cout<}void main() { Input(); Output(); }

什么是归并排序啊,通俗解释一下啊

归并排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序序列。

应该是两个单亲家庭整合成一个新家庭。

满意请采纳哦~O(∩_∩)O谢谢

C语言归并排序 的合并是靠什么实现的。

是的,插入排序 C语言实例 输入参数中,需要排序的数组为array[],起始索引为first,终止索引为last。

调用完成后,array[]中从first到last处于升序排列。

int is1[n],is2[n];// 原数组is1,临时空间数组is2,n为个人指定长度 void mergeSort(int a,int b)// 下标,例如数组int is[5],全部排序的调用为mergeSort(0,4) { if (a<b) { int mid=(a+b)/2; mergeSort(a,mid); mergeSort(mid+1,b); merge(a,mid,b); } } void merge(int low,int mid,int high) { int i=low,j=mid+1,k=low; while (i<=mid&&j<=high) if (is1[i]<=is1[j]) // 此处为排序顺序的关键,用小于表示从小到大排序 is2[k++]=is1[i++]; else is2[k++]=is1[j++]; while (i<=mid) is2[k++]=is1[i++]; while (j<=high) is2[k++]=is1[j++]; for (i=low;i<=high;i++)// 写回原数组 is1[i]=is2[i]; }

在快速排序、堆排序、归并排序中,什么排序是稳定的?

归并排序是稳定的排序算法。

归并排序的稳定性分析: 归并排序是把序列递归地分成短序列,递归出口是短序列只有1个元素或者2个序列,然后把各个有序的段序列合并成一个有序的长序列,不断合并直到原序列全部排好序。

可以发现,在1个或2个元素时,1个元素不会交换,2个元素如果大小相等,没有外部干扰,将不会破坏稳定性。

那么,在短的有序序列合并的过程中,稳定性是没有受到破坏的,合并过程中如果两个当前元素相等时,把处在前面的序列的元素保存在结果序列的前面,这样就保证了稳定性。

所以,归并排序也是稳定的排序算法。

扩展资料: 算法稳定性的判断方法: 在常见的排序算法中,堆排序、快速排序、希尔排序、直接选择排序是不稳定的排序算法,而基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法。

对于不稳定的排序算法,只要举出一个实例,即可说明它的不稳定性;而对于稳定的排序算法,必须对算法进行分析从而得到稳定的特性。

需要注意的是,排序算法是否为稳定的是由具体算法决定的,不稳定的算法在某种条件下可以变为稳定的算法,而稳定的算法在某种条件下也可以变为不稳定的算法。

比如,快速排序原本是不稳定的排序方法,但若待排序记录中只有一组具有相同关键码的记录,而选择的轴值恰好是这组相同关键码中的一个,此时的快速排序就是稳定的。

参考资料来源:搜狗百科-排序算法稳定性

求归并排序算法!

归并排序。

1.这里,在把数组暂时复制到临时数组时,将第二个子数组中的顺序颠倒了一下。

这样,两个子数组从两端开始处理,使得他们互相成为另一个数组的“检查哨”。

这个方法是由R.Sedgewick发明的归并排序的优化。

2.在数组小于某一阀值时,不继续归并,而直接使用插入排序,提高效率。

这里根据Record的结构,将阀值定位 16。

#define THRESHOLD 16 typedef struct _Record{ int data; //数据 int key; //键值 }Record; //供用户调用的排序 函数 void Sort(Record Array[], Record TempArray, int left, int right){ TwoWayMergeSort(Array, TempArray, left, right); } //归并排序 void TwoWayMergeSort(Record Array[], Record TempArray[], int left, int right) { if(right <= left) return; //如果只含一个元素,直接返回 if( right-left+1 ){ //如果序列长度大于阀值,继续递归 int middle = (left + right)/2; Sort(Array, TempArray, left, middle); //对左面进行递归 Sort(Array, TempArray, left, right, middle); //对右面进行递归 Merge(Array, TempArray, left, right, middle); //合并 } else{ //如果序列长度小于阀值,采用直接插入排序,达到最佳效果 ImproveInsertSorter(&Array[left], right-left+1); } } //归并过程 void Merge(Record Array[], Record TempArray[], int left, int right, int middle) { int index1, index2; //两个子序列的起始位置 int k; 复制左边的子序列 for(int i=1; i<=middle; i++){ TempArray[i] = Array[i]; } //复制右边的子序列,但顺序颠倒过来 for(int j=1; j<=right-middle; j++){ TempArray[right-j+1] = Array[j+middle]; } //开始归并 for(index1=left, index2=right, k=left; k<=right; k++){ if(TempArray[index1].key<TempArray[index2].key){ Array[k] = TempArray[index++]; } else{ Array[k] = TempArray[index2--]; } } } //当长度小于阀值时 使用的直接插入排序的代码 void ImproveInsertSorter(Record Array[], int size){ Record TempRecord; //临时变量 for(int i=1; i<size; i++){ TempRecord = Array[i]; int j = i-1; //从i开始往前寻找记录i的正确位置 while(j>=0 && TempRecord.key<Array[j].key){ Array[j+1] = Array[j]; j = j-1; } Array[j+1] = TempRecord; } } 终于敲完了。





第一次回答问题, 只是觉得好玩`

hostodo:美国大流量VPS,低至$3,8T流量/月-1.5G内存/1核/25gNVMe/拉斯维加斯+迈阿密

hostodo从2014年年底运作至今一直都是走低价促销侧率运作VPS,在市场上一直都是那种不温不火的品牌知名度,好在坚持了7年都还运作得好好的,站长觉得hostodo还是值得大家在买VPS的时候作为一个候选考虑项的。当前,hostodo有拉斯维加斯和迈阿密两个数据中心的VPS在促销,专门列出了2款VPS给8T流量/月,基于KVM虚拟+NVMe整列,年付送DirectAdmin授权(发ticket...

日本CN2、香港CTG(150元/月) E5 2650 16G内存 20M CN2带宽 1T硬盘

提速啦简单介绍下提速啦 是成立于2012年的IDC老兵 长期以来是很多入门级IDC用户的必选商家 便宜 稳定 廉价 是你创业分销的不二之选,目前市场上很多的商家都是从提速啦拿货然后去分销的。提速啦最新物理机活动 爆炸便宜的香港CN2物理服务器 和 日本CN2物理服务器香港CTG E5 2650 16G内存 20M CN2带宽 1T硬盘 150元/月日本CN2 E5 2650 16G内存 20M C...

TMTHosting:夏季优惠,美国西雅图VPS月付7折,年付65折,美国服务器95折AS4837线路

tmthosting怎么样?tmthosting家本站也分享过多次,之前也是不温不火的商家,加上商家的价格略贵,之到斯巴达商家出现,这个商家才被中国用户熟知,原因就是斯巴达家的机器是三网回程AS4837线路,而且也没有多余的加价,斯巴达家断货后,有朋友发现TMTHosting竟然也在同一机房,所以大家就都入手了TMTHosting家的机器。目前,TMTHosting商家放出了夏季优惠,针对VPS推...

mergesort为你推荐
旺旺群发软件旺旺群发器哪种好使用微信如何只发文字微信朋友圈如何只发文字,怎么发文字不要图微信网页版登陆首页微信网页版怎么用?微信网页版怎么登陆?动画分镜头脚本动漫脚本和分镜头的区别?懂的进特斯拉model3降价特斯拉官网为何会被挤崩?特斯拉model3降价特斯拉股价为何暴跌?怎么查微信注册时间怎么查看自己的微信号用了多久backupexec如何在Backup Exec 2012中添加要备份的Windows服务器flushes翻譯下面的日記driversbackup电脑里有个“Backup”文件夹是干什么的
花生壳免费域名 187邮箱 日本软银 免备案cdn 新世界电讯 12u机柜尺寸 警告本网站 帽子云 国外免费全能空间 工信部icp备案号 免费测手机号 paypal注册教程 smtp虚拟服务器 海外空间 net空间 七牛云存储 cdn服务 apachetomcat so域名 let 更多