归并排序 非递归 不回写

#include<iostream>
using namespace std;
void Merge(int a[],int b[],int first,int mid,int last)//合并两个有序数组
{
int p=first,q=mid+1;
int pos=first;
while(p<=mid&&q<=last)
{
if(a[p]<a[q])
{
b[pos++]=a[p++];
}
else
{
b[pos++]=a[q++];
}
}
if(p<=mid)
{
while(p<=mid)
{
b[pos++]=a[p++];
}
}
else
{
while(q<=last)
{
b[pos++]=a[q++];
}
}
}

void Merge_pass(int a[],int b[],int gap,int n)//合并指定步长的两个数组
{
int i=0;
int j=0;
while(i<=n-2*gap+1)
{
Merge(a,b,i,i+gap-1,i+gap*2-1);
i=i+gap*2;
}
if(i<(n-gap))//剩的数据多于一个步长,少于两个步长
Merge(a,b,i,i+gap-1,n-1);
else
for(j=i;j<n;j++)
{
b[j]=a[j];
}
}

void Merge_sort(int a[],int b[],int n)//非递归 不回写
{
int gap=1;
while(gap<n)
{
Merge_pass(a,b,gap,n);//a b和b a交替
gap=gap*2;
Merge_pass(b,a,gap,n);
gap=gap*2;
}
}

int main()
{
int a[10]={9,2,3,7,1,8,4,6,5,0};
int b[10];
Merge_sort(a,b,10);
for(int i=0;i<10;i++)
cout<<a[i]<<endl;
system("pause");
return 0;
}

时间: 2024-10-13 10:59:36

归并排序 非递归 不回写的相关文章

归并排序(非递归,Java实现)

归并排序(非递归): public class MergeSort { /** * @param arr 待排序的数组 * @param left 本次归并的左边界 * @param mid 本次归并的中间位置,也就是分界线 * @param right 本次归并的右边界 * @param <T> 泛型 * @local aux 辅助空间(Auxiliary Space) */ private static <T extends Comparable<? super T>&g

归并排序-非递归应用

/** function:     合并2个有序数组,有效到大     input:     数组first pData[begin..mid]     数组second pData[mid+1..end]     output:pData[begin...end]          需要空间:o(n) **/ void merge(int *pData,int begin,int mid,int end) {     int pTemp[8]={0};     int first =begin

归并排序,还有非递归方式没写

#include <iostream> using namespace std; void Merge(int SR[],int i,int m,int n)//n表示数组中最后一个元素的下标,i表示第一个元素的下标,m表示前一个数组最后一个元素的下标 { int *TR=new int[n-i+1]; int ptr1=i; int ptr2=m+1; int j=0; while(ptr1<=m&&ptr2<=n)//可能有一个没有完 { if(SR[ptr1]

【书上讲解】归并排序的非递归写法

描述 [题解] 让区间的长度L为1,2,4,...2^(n-1) 然后对每个位置i开始的长度为L的区间归并有序,用归并排序的方法就好,然后i跳转到i+L 复杂度仍然是log2(n)*n级别的,注意写的时候的一些细节. 比如一定要让最后L>=n的情况进行过一次,不然无法保证整个序列是有序的 [代码] /* 归并排序非递归写法 */ #include <cstdio> const int N = 1e5; int a[N+10],b[N+10]; int n; //把a这个数组在l1..r2

归并排序的递归与非递归实现java

package com.edu.hpu.sort.merge; import com.edu.hpu.sort.Sort; public class MergeSort extends Sort { @Override public int[] doSort(int[] arr) { return mergeSort2(arr, 0, arr.length - 1); } @SuppressWarnings("unused") private int [] mergeSort(int

树的非递归遍历——前序、中序、后序

树的递归遍历非常简单,也是写树的遍历时最常用的写法.但是我发现自己对树的非递归遍历并不十分熟悉,所以把三种非递归遍历都写了一遍,以后看到这篇记录博客也可以帮助自己好好回想熟悉一下. Leetcode对应习题:前序,中序,后序. 相对而言,这三种非递归遍历的难度--前序 < 中序 < 后序. 对于第三种(非递归后序遍历)方法,只要稍微调整下第18~19行三个节点push的顺序,就可以实现前中后序的遍历. 树的非递归前序: 1 class Solution { 2 public: 3 vector

算法之归并排序的递归与非递归的实现

一.什么是归并排序 归并排序就是将多个有序的数据段合成一个有序的数据段,如果参与合并的只有两个有序的数据段,则称为二路归并.与快速排序和堆排序相比,其最大的特点是一种稳定的算法,算法的平均时间复杂度O(nlog2n). 二.归并排序的基本思路 (1).对于一个原始的待排序表,可以将R[1]到R[n]可以看做是n个长度为1的有序表,即分解. (2).进行第一趟归并,即将上述的n个子序两两合并,得到 n/2向上取整 个有序表,若n为奇数,则归并到最后一个子序列长度为1,即合并. (3).再将两个 n

javascript实现非递归--归并排序

另一道面试题是实现归并排序,当然,本人很不喜欢递归法,因为递归一般都是没有迭代法好.所以首选都是用迭代法,但是迭代法确实是难做啊,至底而上的思想不好把握. 这是我的实现代码 /* * * 非递归版归并排序,思路如下: * 至底而上的思路,二和一,四和一,最后是一半一半和整. * 循环从左到右依次执行,为了节省空间,我节省了右序列,将原数列的一部分作为右小序列,这一部分不会被覆盖. * 作者:吴伟欣 * */ function mergeSearch(arr) { var len = arr.le

一步一步写算法(之非递归排序)

原文:一步一步写算法(之非递归排序) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 在上面一篇博客当中,我们发现普通查找和排序查找的性能差别很大.作为一个100万的数据,如果使用普通的查找方法,那么每一个数据查找平均下来就要几十万次,那么二分法的查找呢,20多次就可以搞定.这中间的差别是非常明显的.既然排序有这么好的效果,那么这篇博客中,我们就对排序算做一个总结. 按照我个人的理解,排序可以分为两种:一种是非递归排序,它主要按照非递归的