c - 如何在没有递归但只有循环的情况下实现合并排序?

标签 c

我目前有执行合并排序的代码(尚未完成),我想知道是否有人知道如何进行递归。我卡住的部分是每次拆分后必须继续创建新子数组的部分。例如,如果我有一个长度为8的数组:

我最初需要将2个数组拆分为4和4,然后当我不得不再次拆分为2 2 2 2时,这意味着我需要再添加4个数组..依此类推。我如何做到这一点而无需递归?

到目前为止,我已经在代码中进行了第一次拆分:

void merge_sort(int arr[], int len) // len = 10, array of 10
{
    int i;
    int *firsthalf;
    int *secondhalf;
    int firsthalf_elements, secondhalf_elements;

    if (len<2)
    {
        return;
    }

    firsthalf_elements = len/2;
    secondhalf_elements = len - firsthalf_elements;
    firsthalf = (int*)malloc(sizeof(int) * n1);
    secondhalf = (int*)malloc(sizeof(int) * n2);
    for (i =0; i < firsthalf_elements; i++) 
    {
        firsthalf[i] = arr[i];
    }
    for (i = 0; i < secondhalf_elements; i++) 
    {

        secondhalf[i] = arr[i+firsthalf_elements];
    }

    //Normally over here we would make a recursive call, but i want to do this w/o recursion.

最佳答案

这是无需递归即可实现合并排序的方式。

    #include<stdio.h>
    #include<cstdlib>
    #include<time.h>
    #define n 10//Size of array
    void mergesort(int *,int);
    void merge(int *,int,int,int);
    int min(int,int);
    int main()
    {
         int i;
         int * arr;
         srand(time(NULL));
         arr = (int *)malloc(sizeof(int) * n);
         for(i = 0; i < n; ++i)
             arr[i] = rand()%100;
         printf(" Array before sorting is \n");
         for(i=0;i<n;i++)
              printf(" %d ",arr[i] );
         printf("\n Array after sorting is \n");
         mergesort(arr,n);
         for(i=0;i<n;i++)
              printf(" %d ",arr[i] );
         return 0;
    }
    void mergesort(int *arr,int m)
    {
         int size;
         int index;
         for(size=1;size<m-1;size=size*2)
         {
              for(index=0;index<m-1;index=index+size*2)
              {
                   int middle=index+size-1;
                   int endindex=min(index+2*size-1,m-1);
                   merge(arr,index,middle,endindex);
              }
         }
    }
    void merge(int *arr,int start,int middle,int end)
    {
           int size=end-start+1;
           int temp[n];
           int i=start;
           int j=middle+1;
           int k=start;
           while((i<=middle)&&(j<=end))
           {
                if(arr[i]<=arr[j])
                {
                   temp[k]=arr[i];
                   i++;
                }
                else if (arr[i]>arr[j])
                {
                   temp[k]=arr[j];
                   j++;
                }
                k++;
           }
           if(i>middle)
           {
                 while(j<=end)
                 {
                     temp[k]=arr[j];
                     j++;
                     k++;
                 }
           }
           if(j>end)
           {
                  while(i<=middle)
                 {
                      temp[k]=arr[i];
                      i++;
                      k++;
                 }
           }

           for(i=start;i<k;i++)
                   arr[i]=temp[i];
    }
    int min(int a,int b)
    {
         if(a<=b)
             return a;
         else
             return b;
    }


有关更多详细信息,请访问-
https://github.com/SahdevKansal02/Data-Structures-And-Algorithms.git

关于c - 如何在没有递归但只有循环的情况下实现合并排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26808976/

相关文章:

c++ - 简单的组装题

C 扩展 : <? 和 >?运营商

c - 如何使用 SOCK_DGRAM 制作双向 unix 域套接字?

c - 在二维数组中使用指针

c - 如何在具有多个处理器的机器上并行化算法?

c++ - 哪个子树在 Avl 树删除中具有更高的优先级

c - 字符串输入到gmp整数的最大长度?

c++ - GCC 依赖跟踪 : Is -M better than -MM?

java.lang.UnsatisfiedLinkError - 运行 z/OS 应用程序时

c - C 中的循环 ID 生成器