计算选择排序中的交换次数

时间:2014-02-09 20:43:51

标签: java sorting

我已经阅读了所有试图找到答案的讨论,但没有一个答案对我有用,所以我正在尝试这种方式。

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,因为它只交换第一个和最后一个元素。但是,它不起作用。虽然我知道我的条件不起作用,但我想不出会发生什么。当项目实际交换时,我似乎无法使用它增加交换的逻辑。

2 个答案:

答案 0 :(得分:2)

为什么不在实际执行交换时递增计数器?

//swap smallest found with element in position i.
swap++
temp = num[first];
num[first] = num[i];
num[i] = temp;

编辑:
评论中的好点。如果数组已排序(即firsti相同),当前代码仍会执行多余的交换:

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++;
  }