我已经阅读了所有试图找到答案的讨论,但没有一个答案对我有用,所以我正在尝试这种方式。
public static int SelectionSort(long[] num)
{
int i, j, first;
long temp;
int swap = 0;
int pass = 0;
int count = 0;
boolean Mini = false;
for (i = num.length - 1; i > 0; i--)
{
for(int k = 0; k < num.length; k++)
{
System.out.println(" k = " + k
+ " \t X[i] = " + num[k] + " swap count: " + swap);
}
System.out.println("");
first = 0; //initialize to subscript of first element
for(j = 1; j <= i; j ++) //locate smallest element between positions 1 and i.
{
if(num[j] < num[first])
{
first = j;
//Mini = true;
}
}
//if(Mini){
// swap++;
//}
temp = num[first]; //swap smallest found with element in position i.
num[first] = num[i];
num[i] = temp;
}
return swap;
}
使用简单数组作为我的测试用例:
long[] X = {1, 4, 3, 2, 5};
交换次数应仅等于1,因为它只交换第一个和最后一个元素。但是,它不起作用。虽然我知道我的条件不起作用,但我想不出会发生什么。当项目实际交换时,我似乎无法使用它增加交换的逻辑。
答案 0 :(得分:2)
为什么不在实际执行交换时递增计数器?
//swap smallest found with element in position i.
swap++
temp = num[first];
num[first] = num[i];
num[i] = temp;
编辑:
评论中的好点。如果数组已排序(即first
和i
相同),当前代码仍会执行多余的交换:
if (first != i) {
swap++
temp = num[first];
num[first] = num[i];
num[i] = temp;
}
答案 1 :(得分:1)
通过实现,您将始终具有n个交换(其中n是数组中元素的数量)。
我认为你想要的只是在实际发挥作用时才进行交换...所以当“第一”和“我”有不同的值时。否则你自己切换元素。
if (first != i) {
temp = num[first];
num[first] = num[i];
num[i] = temp;
swapp++;
}