2015-09-07 31 views
0

目前我被要求设计四种排序算法(插入,壳,选择和泡沫),我有4个3中的3个完美工作;唯一不能正常工作的是Bubble Sort。现在,我很清楚正常的气泡排序如何使用temp var来交换两个索引,但棘手的部分是它需要使用数组index [0]作为temp而不是普通的temp,用于交换,并将较低的数组变量向下滑动到列表的前面,并在过程结束时将最后一个索引分配给最大值的temp。使用幻灯片而不是交换的气泡排序

我一直在玩这一段时间,甚至试图查找引用,但可悲的是我找不到任何东西。我希望别人已经做到了这一点,并可以提供一些有用的提示。这是一种最后的手段,因为我一直在用笔和纸来修改和运行通行证,试图发现我的致命错误。无论如何,我的代码如下...

void BubbleSort(int TheArray[], int size) 
{ 
    for (int i = 1; i < size + 1; i++) 
    { 
     TheArray[0] = TheArray[i]; 
     for (int j = i + 1; j < size; j++) 
     { 
      if (TheArray[j] > TheArray[0]) 
       TheArray[0] = TheArray[j]; 
      else 
      { 
       TheArray[j - 1] = TheArray[j]; 
      } 
     } 
     TheArray[size- 1] = TheArray[0]; 
    } 
} 

感谢您的任何反馈;非常感谢。

+4

它可能支付提供你被要求做的确切的措辞,以防你误解了它。从我在这里看到的,你做的第一件事就是覆盖'TheArray [0]'的值,这不是一件好事。 – paddy

+0

您可以使用[XOR-Swap](https://en.wikipedia.org/wiki/XOR_swap_algorithm)。 –

+1

如果说明的目标是向下移动一个子数组(称为幻灯片),那么它不是一个冒泡排序,但是插入排序的变化可以称为删除排序。在子阵列向下移动时,您仍然需要一个临时变量来保存第一个值,然后将该值放在当前空闲位置。如果TheArray [0]不被视为数据的一部分,则可以将其用作临时变量。 – rcgldr

回答

1

如果我没有理解问题的陈述,我认为你正在寻找这些方针的东西:

void BubbleSort(int theArray[], int size) 
{ 
    for (int i = 1; i < size + 1; i++) 
    { 
     theArray[0] = theArray[1]; 
     for (int j = 1; j <= size + 1 - i; j++) 
     { 
      if (theArray[j] > theArray[0]) 
      { 
       theArray[j-1] = theArray[0]; 
       theArray[0] = theArray[j]; 
      } 
      else 
      { 
       theArray[j - 1] = theArray[j]; 
      } 
     } 
     theArray[size-i+1] = theArray[0]; 
    } 
} 

这件作品是你的代码失踪了,我想,是,一旦你找到了新的最大值,在将新的最大值放入Array [0]存储位置之前,必须将其放回数组中(比较后请参阅Array [j-1] = theArray [0])。此外,由于最后一个元素将成为当前最大值,所以内部循环每次都要少运行一次,因此您不想重新访问这些数组元素。 (参见(INT J = 1;Ĵ< =大小+ 1 - 我; J ++))

为了完整起见,这里是我以前(轻度)测试此的主要驱动力:

int main() 
{ 
    int theArray[] = { 0, 5, 7, 3, 2, 8, 4, 6 }; 
    int size = 7; 

    BubbleSort(theArray, size); 
    for (int i = 1; i < size + 1; i++) 
     cout << theArray[i] << endl; 
    return 0; 
}