递归中使用的C代码语句的等效java代码语句

时间:2013-12-08 13:36:54

标签: java c recursion

下面的代码在CI中快速排序试图将相同的代码逻辑转换为java.But,我无法为“partition(& arr [left + 1],size-left-)编写等效的Java代码语句1);”在下面的分区功能。任何人都可以帮忙吗?

   #include<stdio.h>
    int main()
    {
        int arr[8]={4,8,1,6,3,7,2,5};
        partition(arr,8);//Initial Calling of partition function
        int i;
        for(i=0;i<8;i++)
        printf("%d  ",arr[i]);
        return 0;
    }
     void partition(int arr[],int size)
    {
           if(size<2)
           return;
           int pivot=arr[rand()%size];
           int left=0,right=size-1,temp=0;
           while(left<right)
           {
               while(arr[left]<pivot)
               left++;
               while(arr[right]>pivot)
               right--;
               temp=arr[left],arr[left]=arr[right],arr[right]=temp;//swapping values

           }
        //partitioning and recursive calling
           partition(arr,left);
            partition(&arr[left+1],size-left-1);//The problem is to write an equivalent code for this
                                                //line in Java

    }

5 个答案:

答案 0 :(得分:0)

无需处理指针的解决方案是更改标题,如下所示:

void partition(int array[], int firstElement, int lastElement);

您还可以尝试此处描述的copyOf函数:

copyOf

但是你必须重新将它重新组合起来,因为你正在制作副本,而且我怀疑它会更加快速。

public static boolean[] copyOf(boolean[] original,
                               int newLength)

使用false复制指定的数组,截断或填充(如果需要),以使副本具有指定的长度。对于在原始数组和副本中都有效的所有索引,这两个数组将包含相同的值。对于在副本中有效但不在原始副本中的任何索引,副本将包含false。当且仅当指定的长度大于原始数组的长度时,这些索引才会存在。 参数: original - 要复制的数组 newLength - 要返回的副本的长度 返回: 原始数组的副本,用false元素截断或填充以获取指定的长度 抛出: NegativeArraySizeException - 如果newLength为负数 NullPointerException - 如果original为null 以来: 1.6

答案 1 :(得分:0)

要摆脱指针,您需要通过参数指定开始和结束。定义您的功能如下:

void partition(int arr[],int start, int end)

而不是:

int left=0,right=size-1,temp=0;

DO

int left=start,right=end,temp=0;

答案 2 :(得分:0)

C允许您使用指针来引用同一数组中的不同起点。 Java没有。您只能引用整个数组。

但您可以将起始索引添加为参数。

void partition(int arr[],int offset, int length) {
     ...
     partition(arr[], left+1, size-left-1); // check calculation, might be wrong :)
}

答案 3 :(得分:0)

x参数指的是“pivot”值。无论如何,您需要研究该算法的工作原理。

       public static int partition(
        int[] arr, int start, int end, int x)
    {

         int l = start,r = end;

         while (l<r ) {
            if (arr[l] < x)    
               { 
                l =l +1;
               }
            else  {                             

               int temp = arr[l];
                arr[l] = arr[r-1];
                arr[r-1] = temp;
               r = r-1;
            }

         }
         return l;
      } 

答案 4 :(得分:0)

    Below is the equivalent Java code for the above (problem) partition function written in C.The initial call to partition function,say,from inside main, may be somewhat like this:partition(arr,0,arr.length-1);
Thanks for all your support and guidance

  static void partition(int arr[],int first,int last)
    {
        int left=first;
        int right=last,temp=0;
        if(left>=right)
            return;
        Random rnd=new Random();
        int pivot = arr[left + rnd.nextInt(right - left)];
        while(left<right)
        {
            while(arr[left]<pivot)
                left++;
            while(arr[right]>pivot)
                right--;
            temp=arr[left];
            arr[left]=arr[right];
            arr[right]=temp;
        }
        partition(arr,first,left);
        partition(arr,left+1,last);

    }