mergesortjava编程合并排序算法
mergesort 时间:2021-06-26 阅读:(
)
二路归并排序的算法及例子
#include<stdio.h>
#include<stdlib.h>
typedef int RecType;//要排序元素类型
void Merge(RecType *R,int low,int m,int high)
{//将两个有序的子文件R[low..m)和R[m+1..high]归并成一个有序的子文件R[low..high]
int i=low,j=m+1,p=0; //置初始值
RecType *R1; //R1是局部向量
R1=(RecType *)malloc((high-low+1)*sizeof(RecType));
if(!R1)return; //申请空间失败
while(i<=m&&j<=high) //两子文件非空时取其小者输出到R1[p]上
R1[p++]=(R[i]<=R[j])?R[i++]:R[j++];
while(i<=m) //若第1个子文件非空,则复制剩余记录到R1中
R1[p++]=R[i++];
while(j<=high) //若第2个子文件非空,则复制剩余记录到R1中
R1[p++]=R[j++];
for(p=0,i=low;i<=high;p++,i++)
R[i]=R1[p];//归并完成后将结果复制回R[low..high]
}
void MergeSort(RecType R[],int low,int high)
{//用分治法对R[low..high]进行二路归并排序
int mid;
if(low<high){//区间长度大于1
mid=(low+high)/2;//分解
MergeSort(R,low,mid);//递归地对R[low..mid]排序
MergeSort(R,mid+1,high); //递归地对R[mid+1..high]排序
Merge(R,low,mid,high);//组合,将两个有序区归并为一个有序区
}
}
void main()
{
int a[8]={21,34,56,43,99,37,78,10};//这里对8个元素进行排序
int low=0,high=7;//初始化low和high的值
MergeSort(a,low,high);
for(int i=low;i<=high;i++)printf("%d ",a[i]);//输出测试
printf("
");
}在快速排序、堆排序、归并排序中,什么排序是稳定的?
归并排序是稳定的
“快速排序和堆排序都不稳定
不稳定:就是大小相同的两个数,经过排序后,最终位置与初始位置交换了。
快速排序:
27 23 27 3
以第一个27作为pivot中心点,则27与后面那个3交换,形成
3 23 27 27,排序经过一次结束,但最后那个27在排序之初先于初始位置3那个27,所以不稳定。
堆排序:
比如:3 27 36 27,
如果堆顶3先输出,则,第三层的27(最后一个27)跑到堆顶,然后堆稳定,继续输出堆顶,是刚才那个27,这样说明后面的27先于第二个位置的27输出,不稳定。
”
“2 归并排序(MergeSort)
归并排序先分解要排序的序列,从1分成2,2分成4,依次分解,当分解到只有1个一组的时候,就可以排序这些分组,然后依次合并回原来的序列中,这样就可以排序所有数据。
合并排序比堆排序稍微快一点,但是需要比堆排序多一倍的内存空间,因为它需要一个额外的数组。
”
参考资料:java编程合并排序算法
package?p1;
import?java.util.Arrays;
public?class?Guy
{
/**
?*?归并排序
?*/
private?static?void?mergeSort?(?int[]?array,?int?start,?int?end,?int[]?tempArray?)
{
if?(end?<=?start)
{
return;
}
int?middle?=?(?start?+?end?)?/?2;
mergeSort?(array,?start,?middle,?tempArray);
mergeSort?(array,?middle?+?1,?end,?tempArray);
int?k?=?0,?leftIndex?=?0,?rightIndex?=?end?-?start;
System.arraycopy?(array,?start,?tempArray,?0,?middle?-?start?+?1);
for?(?int?i?=?0;?i?<?end?-?middle;?i++?)
{
tempArray[end?-?start?-?i]?=?array[middle?+?i?+?1];
}
while?(k?<?end?-?start?+?1)
{
if?(tempArray[rightIndex]?>?tempArray[leftIndex])?//?从小到大
{
array[k?+?start]?=?tempArray[leftIndex++];
}
else
{
array[k?+?start]?=?tempArray[rightIndex--];
}
k++;
}
}
public?static?void?main?(?String[]?args?)
{
int[]?array?=?new?int[]?{?11,?213,?134,?65,?77,?78,?23,?43?};
mergeSort?(array,?0,?array.length?-?1,?new?int[array.length]);
System.out.println?(Arrays.toString?(array));
}
}
修罗云怎么样?修罗云是一家国内老牌商家,修罗云商家以销售NAT机器起家,国内的中转机相当不错,给的带宽都非常高,此前推荐的也都是国内NAT VPS机器。今天,云服务器网(www.yuntue.com)小编主要介绍一下修罗云的香港云服务器,适合建站,香港沙田cn2云服务器,2核2G,5M带宽仅70元/月起,同时香港香港大带宽NAT VPS低至50元/月起,性价比不错,可以尝试一下!点击进入:修罗云官...
优惠码年付一次性5折优惠码:TYO-Lite-Open-Beta-1y-50OFF永久8折优惠码:TYO-Lite-Open-Beta-Recur-20OFF日本vpsCPU内存SSD流量带宽价格购买1核1.5G20 GB4 TB1Gbps$10.9/月购买2核2 G40 GB6 TB1Gbps$16.9/月购买2核4 G60 GB8 TB1Gbps$21.9/月购买4核4 G80 GB12 TB...
photonvps怎么样?photonvps现在针对旗下美国vps推出半价促销优惠活动,2.5美元/月起,免费10Gbps DDoS防御,Linux系统,机房可选美国洛杉矶、达拉斯、芝加哥、阿什本。以前觉得老牌商家PhotonVPS贵的朋友可以先入手一个月PhotonVPS美国Linux VPS试试了。PhotonVPS允许合法大人内容,支持支付宝、paypal和信用卡,30天退款保证。Photo...
mergesort为你推荐
南宁虚拟空间请问虚拟空间在哪里买?各大网站有没有很好玩的网站啊renderpartialrenderHtml和render有什么区别pat是什么格式怎么将自己做的PS图片保存为PAT格式?webservice框架WebService新手,请教WebService需要什么包databasenamefoxpro中的的命令格式comexception电脑出现ConnectException: 是什么原因?网络安全密钥网络安全密钥和wifi密码有什么区别gas是什么意思gc是什么意思啊?特斯拉model3降价特斯拉官网为何会被挤崩?
免费虚拟主机申请 怎么申请域名 骨干网 淘宝抢红包攻略 紫田 godaddy域名优惠码 tk域名 500m空间 商务主机 个人免费空间 河南移动邮件系统 老左正传 91vps 129邮箱 世界测速 phpmyadmin配置 hkt 丽萨 dnspod 新加坡空间 更多