如何在给定的最大交换次数(m)中仅使用相邻交换按字典顺序对整数数组进行排序

时间:2013-02-11 21:16:23

标签: algorithm

当然,在接受电话采访时我被问过,其他问题哪个好,但是那个我仍然不确定最佳答案。

起初我认为它有一种基数排序但是因为你当然不能只使用相邻的交换。

所以我认为它更像是一个冒泡排序类型算法,这是我试图做的,但“最大交换次数”位使它非常棘手(与他的词汇学部分一起,但我想这只是一个比较方面的问题)

我想我的算法会是这样的(当然现在我的想法比面试时更好!)

int index = 0;
while(swapsLeft>0 && index < arrays.length)
{
  int smallestIndex = index;
  for(int i=index; i < index + swapsLeft)
  {
    // of course < is not correct, we need to compare as string or "by radix" or something
    if(array[i]) < array[smallestIndex]
       smallestIndex = i; 
  }
  // if found a smaller item within swap range then swap it to the front
  for(int i = smallestIndex; i > index; i--)
  {
    temp = array[smallestIndex]; 
    array[smallestIndex] = array[index];
    array[index] = temp
    swapsLeft--;
  }
  // continue for next item in array
  index ++; // edit:could probably optimize to index = index + 1 + (smallestIndex - index) ?
}

这看起来是对的吗?

作为一个更好的解决方案,我很好奇这是一种有效/正确的方法。

1 个答案:

答案 0 :(得分:0)

我正在为我的软件工程学士学位的Java语法编写这个精确的代码。因此,我将通过解释问题以及解决问题的步骤来帮助您解决这个问题。您将需要至少2种方法来多次执行此操作。

首先你拿第一个值,只是为了让它变得简单,让它保持小而简单。

1 2 3 4

您应该使用数组进行排序。要从词汇上找到下一个数字,您可以从最右边开始,向左移动,然后在找到第一个减少时停止。您必须使用右侧的下一个最大值替换该较小的值。因此,对于我们的示例,我们将用4替换3.所以我们的下一个数字是:

1 2 4 3

这很简单吧?不要担心它变得更难。我们现在尝试使用以下方法获取下一个数字:

1 4 3 2

好的,我们从最右边开始向左移动,直到我们的第一个较小的数字。 2小于3小于4大于1.好吧我们首先减少到1.所以现在我们需要向右移动直到我们达到大于1的最后一个数字.4大于1,3大于1,2大于1.好,2是最后一个数字,意味着2需要替换1.但是其余的数字,它们已经按顺序排列,它们只是我们需要的倒退。所以我们需要翻转订单,然后我们提出:

2 1 3 4

因此,您需要一个执行该排序的方法,以及另一个在循环中调用该方法的方法,直到您完成正确数量的参数。