【问题标题】:Count the Number of Swaps in Selection Sort计算选择排序中的交换次数
【发布时间】:2014-02-10 04:58:23
【问题描述】:

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

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

【问题讨论】:

    标签: java sorting


    【解决方案1】:

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

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

    【讨论】:

    • 唯一的问题是程序每次都会增加交换。我只希望它在交换时增加。现在,如果我在那里增加交换,它将给我总共 4 的交换。它应该只给我 1 的交换。
    【解决方案2】:

    通过您的实现,您将始终有 n 次交换(其中 n 是数组中的元素数)。

    我认为您想要的是仅在实际产生影响时才执行交换......所以当“first”和“i”具有不同的值时。否则,您会自行切换元素。

      if (first != i) {
        temp = num[first];
        num[first] = num[i];
        num[i] = temp; 
        swapp++;
      }
    

    【讨论】:

      猜你喜欢
      • 2018-11-07
      • 2013-03-10
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      • 2017-06-06
      • 2013-02-15
      • 2021-02-06
      相关资源
      最近更新 更多