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

2018-03-23  本文已影响0人  开发者zhang

冒泡排序(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

上一篇下一篇

猜你喜欢

热点阅读