gpt4 book ai didi

Java 正在自行对我的 double 组进行排序。为什么?

转载 作者:行者123 更新时间:2023-11-30 02:19:55 25 4
gpt4 key购买 nike

我试图为一个类创建一个合并排序,并偶然发现了这一点。由于某种原因,当我将原始数组拆分为较小的数组时,它会按从最小到最大的顺序对内容进行排序。所以,我所要做的就是将它们重新组合在一起,最终得到我想要的结果。我查遍了我能想到的所有地方,但找不到对该行为的任何解释。无论进行多少次谷歌搜索都没有给我任何答案。

原始数组的内容是使用 Math.random() 生成的 double 值。

相关代码如下:

import java.util.Random;
import java.lang.*;


public class Sorting
{
private static int n = 10;
private static double[] arrOne = null;
private static double[] arrTwo = null;
private static boolean timedOut = false;
private static boolean bubbleTimeOut = false;
private static boolean mergeTimeOut = false;
private static long startTime = 0;
private static long endTime = 0;
private static long bubbleSortTime = 0;
private static long mergeSortTime = 0;

public static void main(String[] args)
{
try
{
while(!(timedOut))
{
arrOne = fillArray();
arrTwo = arrOne;

if(bubbleTimeOut==false)
{
startTime = System.currentTimeMillis();
bubbleSort();
endTime = System.currentTimeMillis();
bubbleSortTime = endTime-startTime;
System.out.println("Bubble sort with "+n+" items takes "+bubbleSortTime+"ms.");
}

if(mergeTimeOut==false)
{
startTime = System.currentTimeMillis();
arrTwo = mergeSort(arrTwo);
endTime = System.currentTimeMillis();
mergeSortTime = endTime-startTime;
System.out.println("Merge sort with "+n+" items takes "+mergeSortTime+"ms.");
}

if(bubbleTimeOut && mergeTimeOut)
{
timedOut = true;
}

n = n*10;
}
}
catch(Exception e)
{
System.out.println("Java ran out of memory.");
}
}

public static double[] mergeSort(double[] arr)
{
if(arr.length<=1)
{
return arr;
}
int middle = arr.length/2;
int left = middle;
int right = arr.length - left;
double[] tempOne = new double[left];
double[] tempTwo = new double[right];

//put first half into an array
for(int i=0; i<left; i++)
{
tempOne[i] = arr[i];
endTime = System.currentTimeMillis();
if(endTime-startTime>20000)
{
mergeTimeOut = true;
return arr;
}
}
//put second half into an array
int temp = 0;
for(int i=left;i<arr.length;i++)
{
tempTwo[temp] = arr[i];
temp++;
endTime = System.currentTimeMillis();
if(endTime-startTime>20000)
{
mergeTimeOut = true;
return arr;
}
}

int ph = tempOne.length + tempTwo.length;
double[] tempThree = new double[ph];
for(int i=0;i<tempOne.length;i++)
{
tempThree[i] = tempOne[i];
endTime = System.currentTimeMillis();
if(endTime-startTime>20000)
{
mergeTimeOut = true;
return arr;
}
}
int k = tempOne.length;
for(int i=0; i<tempTwo.length;i++)
{
tempThree[k] = tempTwo[i];
k++;
endTime = System.currentTimeMillis();
if(endTime-startTime>20000)
{
mergeTimeOut = true;
return arr;
}
}
return arr;
}

public static void bubbleSort()
{
double ph = 0;
boolean swapped = true;
while(swapped)
{
swapped = false;
for(int i=n-1; i>0; i--)
{
if(arrOne[i] < arrOne[i-1])
{
ph = arrOne[i];
arrOne[i] = arrOne[i-1];
arrOne[i-1] = ph;
swapped = true;
}
endTime = System.currentTimeMillis();
if(endTime-startTime>20000)
{
swapped = false;
bubbleTimeOut = true;
}
}
}
}

//this method is just to help me test my code.
public static void printArray(double[] arr)
{
for(int i=0; i<arr.length; i++)
{
System.out.println(arr[i]);
}
}

public static double[] fillArray()
{
double[] arr = new double[n];
double rand = 0.0;
for(int i=0;i<n;i++)
{
rand = Math.random();
arr[i] = rand;
}
return arr;
}
}

因此,如果原始内容是 {8,5,4,7,3,1,2,6},那么我将其分成两半并将其重新组合在一起后,我将得到 {1,2, 3,4,5,6,7,8},而我不必实际对任何内容进行排序。

最佳答案

麻烦从这里开始:

arrOne = fillArray();
arrTwo = arrOne;

这使得 arrTwo 只是 arrOne 的“别名”,即引用相同数据的另一个名称。为了避免这种情况,如果您确实希望它们成为具有相同内容的两个单独的数组,则必须复制数组,例如使用

arrOne = fillArray();
arrTwo = Arrays.copyOf(arrOne,arrOne.length);

或者,当然,如果您无法使用数组,则可以使用 for 循环手动执行此操作。

关于Java 正在自行对我的 double 组进行排序。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47174037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com