Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 合并排序递归_Sorting_Merge_Mips - Fatal编程技术网

Sorting 合并排序递归

Sorting 合并排序递归,sorting,merge,mips,Sorting,Merge,Mips,我需要为合并排序编写一个MIPS汇编语言代码。我已经创建了merge函数,但是使用递归的merge\u sort函数让我很困惑。我已经发布了同样的参考C代码。我知道,堆栈将不得不使用,但是,无法做到这一点,作为一个初学者自己,我将感谢任何形式的帮助 int merge_sort(int arr[],int low,int high) { int mid; if(low<high) { mid=(low+high)/2; // Divide and Conquer merge_sor

我需要为合并排序编写一个MIPS汇编语言代码。我已经创建了merge函数,但是使用递归的merge\u sort函数让我很困惑。我已经发布了同样的参考C代码。我知道,堆栈将不得不使用,但是,无法做到这一点,作为一个初学者自己,我将感谢任何形式的帮助

int merge_sort(int arr[],int low,int high)
{
  int mid;
  if(low<high) {
mid=(low+high)/2;
// Divide and Conquer
merge_sort(arr,low,mid);
merge_sort(arr,mid+1,high);
// Combine
merge(arr,low,mid,high);
 }

 return 0;
}
int-merge_排序(int-arr[],int-low,int-high)
{
int mid;

如果(低为什么不从下往上,首先
合并
成对的单例,然后是成对的已排序的2长度子数组,然后是成对的4长度子数组,等等,
logn
在循环中通过同一数组

剩下的问题是实现
merge
。它将被重复调用,但不是递归调用。当然,这个
merge
必须将其输出写回到输入区域的数组中,可能需要对其输入进行临时复制

void mrgsort( int a[], int n) // pseudo-code
{
    if( n < 1 ) return;
    int s1 = 1, s2 = 2;
    do
    {
        int i, k = n/s2, p1=0, p2=s1;
        for( i=0; i<k; ++i, p1+=s2, p2+=s2 )
        {
            merge(p1, p2); // merge chunks of size s1
        }
        //  deal with the edge ...
        if( i > 0 )
        {
            if( p2 < n ) merge_edge(p1,p2,n); // 2nd chunk shorter
        }
        s1 = s2;
        s2 = s2*2;
    } while( s2 <= n )
    if( s1 < n )
        merge_edge(0,s1,n);                   // 2nd chunk shorter
}
void mrgsort(int a[],int n)//伪代码
{
如果(n<1)返回;
int s1=1,s2=2;
做
{
int i,k=n/s2,p1=0,p2=s1;
对于(i=0;i=0)
{
如果(p2}while(s2)你试过什么?你能把简单的非递归C函数转换成MIPS吗?我确实是这样想的,但是在MIPS中实现它有点麻烦。是的,这里的问题不是合并,而是合并排序(有递归部分)。合并逻辑很容易转换为汇编代码。但它不必是递归的。您只需在增加单元大小的同时对数组进行循环扫描。