C#中的冒泡排序

时间:2014-04-26 11:41:19

标签: algorithm sorting c#-4.0 bubble-sort

我正在研究算法,我有两个冒泡排序函数/方法,它们都提供类似的结果。可以请别人告诉我更多关于他们的事情,比如演出等吗?

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;
            }
        }
    }
}

3 个答案:

答案 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;
            }
        }
    }
}