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;
}
}
终于敲完了。
。
。
第一次回答问题, 只是觉得好玩`
弘速云是创建于2021年的品牌,运营该品牌的公司HOSU LIMITED(中文名称弘速科技有限公司)公司成立于2021年国内公司注册于2019年。HOSU LIMITED主要从事出售香港VPS、美国VPS、香港独立服务器、香港站群服务器等,目前在售VPS线路有CN2+BGP、CN2 GIA,该公司旗下产品均采用KVM虚拟化架构。可联系商家代安装iso系统。国庆活动 优惠码:hosu10-1产品介绍...
Hostodo近日发布了美国独立日优惠促销活动,主要推送了四款特价优惠便宜的VPS云服务器产品,基于KVM虚拟架构,NVMe阵列,1Gbps带宽,默认分配一个IPv4+/64 IPv6,采用solusvm管理,赠送收费版DirectAdmin授权,服务有效期内均有效,大致约为7折优惠,独立日活动时间不定,活动机型售罄为止,有需要的朋友可以尝试一下。Hostodo怎么样?Hostodo服务器好不好?...
易探云香港vps主机价格多少钱?香港vps主机租用费用大体上是由配置决定的,我们选择香港vps主机租用最大的优势是免备案vps。但是,每家服务商的机房、配置、定价也不同。我们以最基础配置为标准,综合比对各大香港vps主机供应商的价格,即可选到高性能、价格适中的香港vps主机。通常1核CPU、1G内存、2Mbps独享带宽,价格在30元-120元/月。不过,易探云香港vps主机推出四个机房的优惠活动,...
mergesort为你推荐
chartboost公司有1款体育类手游想海外运营应当怎样做?activity跳转android activity跳转怎么传对象郭列90后三无人物,如何创业?如何去实现人生价值?最好的翻译网站求最好的翻译网站和软件上行宽带上行宽带和下行宽带什么意思微信网页版登陆首页微信网页版怎么用?微信网页版怎么登陆?医院排队系统医院排队叫号系统有哪些功能?flex是什么Adobe 软件系列有那些,分别是做什么的?如何查看qq特别关心我的人qq空间特别关心我的人怎么看网页背景音乐代码有没有网页背景音乐播放器代码??
域名服务器是什么 域名备案流程 服务器配置技术网 virpus 42u机柜尺寸 英文简历模板word 贵州电信宽带测速 轻博 typecho idc资讯 qq对话框 酷番云 多线空间 1元域名 河南移动梦网 广州服务器托管 SmartAXMT800 fatcow 香港打折信息 德国代理ip 更多