我在这里创建了一个简单的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;
}
答案 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;
}