提问人:hipposaver 提问时间:11/14/2023 最后编辑:Abrahipposaver 更新时间:11/14/2023 访问量:60
数组在第一次通过后保持排序,不知道为什么 [关闭]
array staying sorted after first pass not sure why [closed]
问:
从我的标题可以看出,我不太确定该如何措辞。我只是回到一些编码和做基本练习。我认为从排序算法开始会很棒。我正在尝试加载文件,然后对其进行排序。到目前为止,我有 3 种算法编码。希望我发布的内容足以让你们了解这个问题。
我的排序类正在更改我的数组,即使我正在尝试更新不同的数组。
我首先使用我调用的函数从文件中加载数组 - 它工作正常。ReadFileToArray
int[] arr;
int[] sortedArray;
String fp = "C:/Users/test.txt";
arr = ReadFileToArray(fp);
然后,我使用排序类对数组进行排序:
Sorting mySorting = new Sorting();
int SelectionSort = 1
System.out.println("\r\nSorting using selection sort:");
sortedArray = mySorting.SortIt(arr, SelectionSort);
for (int i = 0; i < arr.length; i++) {
System.out.println(sortedArray[i]);
}
如果有,这适用于 3 种排序类型并排序良好。
但问题是,如果我现在再进行一次排序,即使它仍然应该维护未排序的列表(或者至少我认为这是因为我正在更新该函数,而不是它本身)。arr
sortedArray
arr
出于测试目的,如果我这样做:
Sorting mySorting = new Sorting();
int SelectionSort = 1
System.out.println("\r\nSorting using selection sort:");
sortedArray = mySorting.SortIt(arr, SelectionSort);
for (int i = 0; i < arr.length; i++) {
System.out.println(sortedArray[i]);
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
arr
现在打印件也已排序。
我没有故意使用任何指针或记忆的东西,所以我不记得为什么会发生这种情况,我也不记得谷歌做什么。我发现我可以先将数组复制到未排序的数组中,然后在每次我想测试排序算法时将其复制回来,但我希望有人能为我指出正确的方向,以再次导致这种情况。
谢谢!
[已编辑以删除文件路径信息。
答:
您的排序代码会修改(即破坏)输入。
Java 是按值传递的(即,每当您将值传递给方法时,都会传递一个副本),但是,一切都是引用。当你写:
int[] arr = new int[10];
这类似于“盖房子”,但不是房子——不,这只是地址簿中的一页。 不是说“ARR现在是房子”,不,意思是:把右边的东西的地址写在左边的通讯录页上。new int[10]
int[] arr
=
=
因此,当您调用 时,java 会适当地复制,但它正在复制通讯录页面。不是整个房子。SortIt(arr)
然后,你的排序方法遵循它得到的副本,将一块砖头扔进窗户,然后加速离开,这个小拖欠者。然后,您的主要方法稍后会转到并遵循其通讯簿页面。同一所房子,并注意到它已被破坏。
您有 4 个选项可以解决此问题:
- 让你的主代码做一个副本,并将副本交给你的排序方法。可以使用 制作副本。
Arrays.copyOf(arr)
- 让您的排序方法复制它收到的任何错误。
- 让您的排序方法在不修改输入的情况下完成其工作。那是。。几乎将归结为选项 2,除非输入已经排序。
- 编写主代码,以便传递数组的方法修改它不再重要。
评论
Arrays.toString
方法打印整个数组。这链接到采用 的 API 方法,但对于其他类型,它重载了。int
Sorting