我写了选择和插入排序算法,它给了我错误的未排序输出。这是我的选择代码:
public class SelectionSort {
public static void main(String[] args) {
int[] arr = {23,43,45,3,54,55,23,12,22};
int min;
int temp = 0;
for(int i = 0; i < arr.length-1; i++)
{
min = i;
for(int j = i+1; j<arr.length; j++)
{
if(arr[j] < arr[min])
{
min = j;
}
temp = arr[j];
arr[j] = arr[min];
arr[min] = temp;
}
}
for(int i = 0; i < arr.length; i++)
{
System.out.print(arr[i]+" ");
}
}
}
产出:45 55 54 43 23 23 22 12 3
这没有排序,我希望它按升序排序。
这是我的插入排序:
public class Insertion {
public static void main(String[] args) {
int[] arr = {2,4,6,5,4,3,5,3};
for(int i = 1; i < arr.length; i++)
{
int temp = arr[i];
int j = i;
while( j > 0 && arr[j-1] > arr[j])
{
arr[j] = arr[j-1];
j = j-1;
}
arr[j] = temp;
}
for(int i = 0; i < arr.length; i++)
{
System.out.print(arr[i] + " ");
}
}
}
输出:2 4 5 4 3 5 3 6
答案 0 :(得分:1)
在您的选择排序中,让我们关注代码的这一部分:
for(int i = 0; i < arr.length-1; i++)
{
min = i;
for(int j = i+1; j<arr.length; j++)
{
if(arr[j] < arr[min])
{
min = j;
}
temp = arr[j]; // <---
arr[j] = arr[min];
arr[min] = temp;
}
}
选择排序背后的高级思想是找到范围[i,n)中的最小元素,然后将其与位置i处的元素交换。请注意,使用此处的代码,您不断地使用min的索引交换当前索引,而不是您要进行的交换。作为提示,在外循环的每次迭代中最多进行一次交换,并使该交换位于位置i
和位置min
之间。如果你早于此交换,你将得到错误的答案。
对于您的插入排序,有一个更微妙的错误。这是错误的地方:
while( j > 0 && arr[j-1] > arr[j])
{
arr[j] = arr[j-1];
j = j-1;
}
arr[j] = temp;
请注意,只要当前元素的比较小于它之前的元素,就会用当前元素覆盖当前元素,然后递减j。但是,您不会使用当前元素更新arr[j-1]
,因此在下一次比较中,您将以前位于j-1
的元素与位置{{1}中的元素进行比较而不是将当前元素与位置j-2
中的元素进行比较。要解决此问题,请将比较更新为始终与j-2
进行比较,而不是temp
:
arr[j]