下面的代码在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
}
答案 0 :(得分:0)
无需处理指针的解决方案是更改标题,如下所示:
void partition(int array[], int firstElement, int lastElement);
您还可以尝试此处描述的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);
}