我试图了解所有交换算法中最简单的算法,即bubblesort。然而,我似乎对实际交换值的步骤感到困惑,例如考虑代码:
void bubbleSort(int arr[], int n) {
bool swapped = true;
int j = 0;
int tmp;
while (swapped) {
swapped = false;
j++;
for (int i = 0; i < n - j; i++) {
if (arr[i] > arr[i + 1]) {
tmp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = tmp;
swapped = true;
}
}
}
}
我们说我有一个这样的数字列表:
7 1 3 4 6 3 5
我想交换前两个值7和1:
按照我的逻辑,这就是我理解这段代码的方式:
设置临时变量等于7,所以
temp = 7;
将7设置为等于下一个值,所以
7 = 1;
?
目前的清单是:
1 1 3 4 6 3 5
Where temp = 7
现在设置1等于temp,即7? 1 =临时;
So the list is now:
1 7 3 4 6 3 5
我的理解是否正确?
答案 0 :(得分:1)
首先,你似乎走在了正确的轨道上。
一些提示可帮助您在旅程中取得进一步进展。
了解标准模板库。有一个名为swap
的函数,它完全按照它在锡上所说的那样。
其次使用容器。它们比C风格的数组更不容易出错。
答案 1 :(得分:0)
在此代码段中
if (arr[i] > arr[i + 1]) {
tmp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = tmp;
swapped = true;
}
您需要交换两个对象arr[i]
和arr[i + 1]
如果你直接写
arr[i] = arr[i + 1];
然后这两个对象将具有相同的值,即arr[i]
的前一个值将丢失。
首先,您需要在某处保留此值。为此,声明了一个辅助中间变量tmp
首先,arr[i]
的值保留在变量tmp
中
我们假设arr[i]
的值为7,arr[i + 1]
的值为1。
tmp = arr[i];
现在tmp
和arr[i]
具有相同的值7。
然后arr[i]
被arr [i + 1]
arr[i] = arr[i + 1];
现在这两个变量具有相同的值1,即arr[i + 1]
我们tmp
等于7,arr [i]和arr[i + 1]
等于1
但arr[i]
的先前值保留在变量tmp
中
现在,此值已分配给arr[i + 1]
arr[i + 1] = tmp;
我们得到arr[i + 1]
等于7,arr[i]
等于tp 1
因此交换了价值。