我正在研究算法,我有两个冒泡排序函数/方法,它们都提供类似的结果。可以请别人告诉我更多关于他们的事情,比如演出等吗?
public void BubbleSort() {
int temp;
for (int outer = upper; outer >= 1; outer--) {
for (int inner = 0; inner <= outer - 1; inner++) {
if ((int)arr[inner] > arr[inner + 1]) {
temp = arr[inner];
arr[inner] = arr[inner + 1];
arr[inner + 1] = temp;
}
}
}
}
public void BubbleSor2() {
int temp;
for (int outer = 0; outer < upper - 1; outer++) {
for (int inner = 1; inner <= upper; inner++) {
if ((int)arr[outer] > arr[inner]) {
temp = arr[inner];
arr[inner] = arr[outer];
arr[outer] = temp;
}
}
}
}
答案 0 :(得分:1)
它们是相反的,但是,实现是不正确的。用这个替换它:
public void BubbleSort() {
int temp;
for (int outer = upper; outer >= 1; outer--) {
for (int inner = outer - 1; inner >= 0; inner--) {
if (arr[inner] < arr[outer]) {
temp = arr[inner];
arr[inner] = arr[outer];
arr[outer] = temp;
}
}
}
}
public void BubbleSor2() {
int temp;
for (int outer = 0; outer < upper - 1; outer++) {
for (int inner = outer + 1; inner < upper; inner++) {
if (arr[inner] > arr[outer]) {
temp = arr[inner];
arr[inner] = arr[outer];
arr[outer] = temp;
}
}
}
}
两者的复杂性是二次的(O(n ^ 2))
答案 1 :(得分:0)
第一个在外面有一个n循环。这里n = upper - 1;并且在每次迭代中,它比前一次迭代运行少一次。所以它运行(n*(n-1))/2 = (n^2-n)/2
次。这是O(n ^ 2)的复杂性。
第二个不是冒泡排序,虽然它的结果与第一个相同。它以O(n ^ 2)复杂度运行。
第一次迭代中的第一次将arr
中的最大值放在upper
位置。在第二次迭代中,将arr
中的第二个最大值放在upper-1
位置,第三次迭代将第三个最大值放在upper-2
位置,依此类推。每次将最大值放在(last position of array - iteration number)
位置。因此泡沫排序。
第二个目标是相同的目标,但具有不同的apporach。在第一次迭代中,将arr
中的最小值放在0
位置。在第二次迭代中,将arr
中的第二个最小值放在1
位置,第三次迭代将第三个最大值放在2
位置,依此类推。每次将最小值放入iteration number-1
位置。
答案 2 :(得分:0)
尝试使用此版本的冒泡排序。
public void BubbleSort()
{
int temp;
for (int outer = 0; outer < upper - 1; outer++)
{
for (int inner = 0; inner < upper - outer; inner++)
{
if (arr[inner + 1] < arr[inner])
{
temp = arr[inner + 1];
arr[inner + 1] = arr[inner];
arr[inner] = temp;
}
}
}
}