有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

下面的代码用C进行快速排序。我试图将相同的代码逻辑翻译成java。但是,我无法为“partition(&;arr[left+1],size-left-1);”编写等效的Java代码语句在下面的配分函数中。有人能帮忙吗

   #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) 个答案

  1. # 1 楼答案

    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;
          } 
    
  2. # 2 楼答案

    要去掉指针,需要指定start和end by参数。定义你的功能如下:

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

    而不是:

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

    int left=start,right=end,temp=0;
    
  3. # 3 楼答案

        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);
    
        }
    
  4. # 4 楼答案

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

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

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

    一种不需要处理指针的解决方案是如下更改标题:

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

    您也可以尝试下面介绍的copyOf功能:

    copyOf

    但是你必须重新构建它,因为你正在制作副本,我怀疑它会不会太快

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

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