java 冒泡排序

冒泡排序:

一种交换排序,基本思想是两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止

比如数组{9,1,5,8,3,7,6,2}

使用冒泡排序-->

    第一轮  [1, 5, 8, 3, 7, 6, 2, 9]

    第二轮  [1, 5, 3, 7, 6, 2, 8, 9]

    第三轮  [1, 3, 5, 6, 2, 7, 8, 9]

    第四轮  [1, 3, 5, 2, 6, 7, 8, 9]

    第五轮  [1, 3, 2, 5, 6, 7, 8, 9]

    第六轮  [1, 2, 3, 5, 6, 7, 8, 9]

    第七轮  [1, 2, 3, 5, 6, 7, 8, 9]

    第八轮  [1, 2, 3, 5, 6, 7, 8, 9]

    第九轮  [1, 2, 3, 5, 6, 7, 8, 9]

每轮都会有一个之排序到正确位置;

冒泡排序的标准代码:

void BubbleSort(vector<int>& vec)
{
    int n = vec.size();
    for (int i = 0; i < n; ++i)
    {
        for (int j = n - 2; j >= i; --j) //注意j是从后往前循环
        {
            if (vec[j] > vec[j + 1]) 
                swap(vec[j], vec[j + 1]);//替换元素的方法
        }
    }
}

如数组 {2,1,3,4,5,6,7,8,9} 

使用冒泡排序-->

    第一轮  [1, 2, 3, 5, 6, 7, 8, 9]

    第二轮  [1, 2, 3, 5, 6, 7, 8, 9]

    第三轮  [1, 2, 3, 5, 6, 7, 8, 9]

    第四轮  [1, 2, 3, 5, 6, 7, 8, 9]

    第五轮  [1, 2, 3, 5, 6, 7, 8, 9]

    第六轮  [1, 2, 3, 5, 6, 7, 8, 9]

    第七轮  [1, 2, 3, 5, 6, 7, 8, 9]

    第八轮  [1, 2, 3, 5, 6, 7, 8, 9]

    第九轮  [1, 2, 3, 5, 6, 7, 8, 9]

 

可以看到,在序列基本有序的情况下,在第一次排序后就已经完全有序,但此时算法仍在不断的进行循环判断,这种无意义的循环判断明显的降低了效率,因此,为了减少这种无意义的判断,我们可以将算法作如下改进:

 

   public static void BubbleSort(int[] vec)
    {
        int n = vec.length;
        boolean flag = true;
        for (int i = 0; i < n && flag; ++i)
        {
            flag = false;
            for (int j = 0; j <n-1-i; j++)
            {
                if (vec[j] > vec[j + 1]) {
                    int temp =  vec[j];
                    vec[j] = vec[j + 1];
                    vec[j + 1] = temp;
                    flag = true;  
                }
            }
            System.out.println(Arrays.toString(vec));
        }
    }

结果如下:

可以看到明显的减少了无意义的循环判断 

 

posted @ 2019-08-07 19:17  加了冰的才叫可乐  阅读(242)  评论(0编辑  收藏  举报