美文网首页
冒泡排序(Bubble Sort)以及改进

冒泡排序(Bubble Sort)以及改进

作者: 开发者zhang | 来源:发表于2018-03-23 21:52 被阅读0次

    冒泡排序(Bubble Sort)

    • 最简单写法
    //冒泡排序:与后面比较,大于则交换(冒泡)
    void BubbleSort_1(int a[], int size)
    {
        for (int i = 0; i < size; i++)
        {
            for (int j = i+1; j < size ; j++)
            {
                if (a[i] > a[j])
                {
                    int temp = a[i];
                    a[i] = a[j];
                    a[j] = temp;
                }
            }
        }
    }
    

    冒泡排序改进

    • 优化:从尾部开始向前移动

    好处在于:排序时候从后边开始,将较小者往前边移动。这样较小者会不断往前移动。解决了第一种写法,可能将较小者移到后边的情况,提高了算法效率。在上十万条数据的排序过程中,这种差异将会体现出来。

    //优化3:优化从尾部开始向前移动
    void BubbleSort_3_1(int a[], int size)
    {
        for (int i = 0; i < size -1; i++)
        {
            for (int j = size - 1; j > i ; j--)
            {
                if (a[j-1] > a[j])
                {
                    int temp = a[j-1];
                    a[j-1] = a[j];
                    a[j] = temp;
                }
            }
        }
    }
    
    • 优化:添加标记,标记每趟是否交换了数值,没有说明排序完成,提前结束
    //优化1:标记每趟是否交换了数值,没有说明排序完成,提前结束
    void BubbleSort_3_2(int a[], int size)
    {
        int bSwaped = 1;
        for (int i = 0; i < size -1; i++)
        {
            // 每次先重置为false
            bSwaped = 0;
            for (int j = size - 1; j > i ; j--)
            {
                if (a[j-1] > a[j])
                {
                    int temp = a[j-1];
                    a[j-1] = a[j];
                    a[j] = temp;
                    
                    bSwaped = 1;
                }
            }
            // 如果上一次扫描没有发生交换,则说明数组已经全部有序,退出循环
            if (!bSwaped)
                break;
        }
    }
    

    *优化:记录上次扫描最好一次交换的位置,确定无序区间

    思路:
    在第一步优化的基础上发进一步思考:如果R[0..i]已是有序区间,上次的扫描区间是R[i..n],记上次扫描时最后一次执行交换的位置为lastSwapPos,则lastSwapPos在i与n之间,不难发现R[i..lastSwapPos]区间也是有序的,否则这个区间也会发生交换;所以下次扫描区间就可以由R[i..n] 缩减到[lastSwapPos..n]。

    
    void BubbleSort_3_3(int a[], int size)
    {
        int lastSwapPos = 0,lastSwapPosTemp = 0;
        for (int i = 0; i < size - 1; i++)
        {
            lastSwapPos = lastSwapPosTemp;
            for (int j = size - 1; j >lastSwapPos; j--)
            {
                if (a[j - 1] > a[j])
                {
                    int temp = a[j - 1];
                    a[j - 1] = a[j];
                    a[j] = temp;
                    
                    lastSwapPosTemp = j;
                }
            }
            if (lastSwapPos == lastSwapPosTemp)
                break;
        }
    }
    
    

    and so on

    相关文章

      网友评论

          本文标题:冒泡排序(Bubble Sort)以及改进

          本文链接:https://www.haomeiwen.com/subject/kolfcftx.html