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));
}
}
racknerd当前对美国犹他州数据中心的大硬盘服务器(存储服务器)进行低价促销,价格跌破眼镜啊。提供AMD和Intel两个选择,默认32G内存,120G SSD系统盘,12个16T HDD做数据盘,接入1Gbps带宽,每个月默认给100T流量,5个IPv4... 官方网站:https://www.racknerd.com 加密数字货币、信用卡、PayPal、支付宝、银联(卡),可以付款! ...
hostsailor怎么样?hostsailor成立多年,是一家罗马尼亚主机商家,机房就设在罗马尼亚,具说商家对内容管理的还是比较宽松的,商家提供虚拟主机、VPS及独立服务器,今天收到商家推送的八月优惠,针对所有的产品都有相应的优惠,商家的VPS产品分为KVM和OpenVZ两种架构,OVZ的比较便宜,有这方面需要的朋友可以看看。点击进入:hostsailor商家官方网站HostSailor优惠活动...
DMIT怎么样?DMIT最近动作频繁,前几天刚刚上架了日本lite版VPS,正在酝酿上线日本高级网络VPS,又差不多在同一时间推出了美国cn2 gia线路不限流量的美国云服务器,不过价格太过昂贵。丐版只有30M带宽,月付179.99美元 !!目前,美国云服务器已经有个4个套餐,分别是,Premium(cn2 gia线路)、Lite(普通直连)、Premium Secure(带高防的cn2 gia线...
mergesort为你推荐
中国学生网全国统一学籍号查询旺旺群发软件旺旺群发软件哪个比较好prisma安卓版Prisma安卓版能不能用renderpartialrender farm 是什么意思listviewitemListView具有多种item布局wow服务器状态我电脑上的魔兽服务器状态很好.但是还是玩不起来.请问可以玩了不?netbios协议NetBIOS协议起什么作用?yui3YUI最详细的资料怎么查微信注册时间微信号用了多久,怎么知道短信套餐移动有什么短信包月套餐,怎么开通?
厦门域名注册 域名服务dns的主要功能为 服务器评测 韩国加速器 英语简历模板word typecho panel1 数字域名 789电视网 什么是服务器托管 免费dns解析 万网空间购买 双线机房 银盘服务 阿里云官方网站 lick 东莞服务器托管 789电视剧网 阿里云邮箱怎么注册 谷歌搜索打不开 更多