对bubblesort方法很好奇

时间:2011-10-26 22:41:26

标签: c++ function bubble-sort

我在这里创建了一个简单的bubblesorting脚本,它接受数组并对它们进行排序,这只是代码的一小部分。但它的代码对其进行排序。我想这样做,而不是每次传球都进行九次左右的比较,修改气泡排序,在第二次传球上进行八次或一次的比较,第三次传球时进行七次比较,依此类推。我完全失去了如何实现它。最好的想法是什么?

        int bubbleSortArray(int array[])
        {
            for(int i=0;i<10;i++)
            {
                for(int j=0;j<i;j++)
                {
                    if(array[i]>array[j])
                    {
                        swap(array[i], array[j]);
                        amountOfSwaps += 1;
                    }
                }
            }

        printArray(array);
        return amountOfSwaps;

        }


       void swap(int & value1, int & value2)
       {
              int temp=value1; 
              value1=value2;
              value2=temp;
       }

3 个答案:

答案 0 :(得分:1)

我认为你的j循环有点落后了。我认为你需要这样的东西:

for (int i = 0; i < 10; i++) {
    for (int j = 1; j < 10 - i; j++) {
        // ...
    }
}

答案 1 :(得分:1)

您的代码已经在执行您正在寻找的内容。由于j迭代到长度i,因此每次增长一个。我认为你很困惑,因为你的代码实际上是在问题中从你的英语向后实现它;)

这是一个示例数组,以及每次迭代时所做的修改。括号表示在每次迭代中检查数组的哪个部分:

(7)5 3 8 6 9 4 2 0 1
(7 5)3 8 6 9 4 2 0 1
(7 5 3)8 6 9 4 2 0 1
(8 7 5 3)6 9 4 2 0 1
(8 7 6 5 3)9 4 2 0 1
(9 8 7 6 5 3)4 2 0 1
(9 8 7 6 5 4 3)2 0 1
(9 8 7 6 5 4 3 2)0 1
(9 8 7 6 5 4 3 2 0)1
(9 8 7 6 5 4 3 2 1 0)

正如你所看到的,第一次通过什么都没有实际完成,也不会因为你正在比较一个元素与自身。第二次通过你现在比较两个元素,然后是三个,然后等等。

要让你的代码开始比较所有代码,然后每次少做一次(正如你的问题所述)你会修改你循环到以下(注意j&lt; 10-i):

    for(int i=0;i<10;i++)
    {
        for(int j=0;j<10-i;j++)
        {

无论哪种方式,它都是相同的东西,最终会起作用。您可以通过设置i = 1来进一步跳过与自身的第一次比较:

for(int i=1;i<10;i++)
    {
        for(int j=0;j<10-i;j++)
        {

这将取消上面的第一个比较,这是您正在寻找的其他优化。

答案 2 :(得分:0)

请注意,bubblesort的区别属性是它检查每次传递是否完全执行交换。如果它没有交换,那么一切都井井有条,你可以提早破产。像这样:

int bubbleSort(int *arry, size_t size)
{
  bool swapped;
  size_t upper_bound = size;
  int amountOfSwaps = 0;

  do
  {
    swapped = false;
    for(int i = 1; i < upper_bound; ++i)
    {
      if(arry[i] < arry[i - 1])
      {
        swap(arry[i], arry[i - 1]);
        swapped = true;
        ++amountOfSwaps;
      }
    }
    --upper_bound;
  }while(swapped);

  return amountOfSwaps;
}