小菜乃机械狗一枚,不知何原因接触代码好多年,于是乎决心找个程序猿工作。昨天面试华硕科技,主管让我排序一个数组,再三询问可不可以写冒泡后,还是写了个冒泡程序,结果没完,让我改进冒泡算法,已优化比较次数,这才发现自己的功力真低·····

废话不多说,先来个冒泡的原始版本:

void bobble_sort1(int *array,int length)
{
    for (int i=0;i<length;++i)
    {
        for (int j = length-1;j>i;--j)
        {
            if (array[j-1]>array[j])    //每次将最小值“冒”在前面
            {
                exchange(&array[j],&array[j-1]);    
            }
        }
    }
}
View Code

改进一:

在原始版本中,如果某次内层循环没有进行交换,则说明数组已经排好序,无需再扫描。于是可以设置一个标志来记录是否某次内循环没有交换,若标志为false,则退出外层循环,排序结束:

 

void bobble_sort1EX(int *array,int length)
{
    bool flag = true;
    for (int i=0;i<length && flag;++i)
    {
        flag = false;
        for (int j=length-1;j>i;--j)
        {
            if (array[j-1]>array[j])
            {
                exchange(&array[j-1],&array[j]);
                flag = true;
            }
        }
    }
}

 

改进二:

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

void bubble_sort2EX(int array[],int length)
{
    int lastSwapPos;
    int lastSwapPos_temp = 0;
    for (int i=0;i<length;++i)
    {
        lastSwapPos = lastSwapPos_temp;
        for (int j = length-1;j>lastSwapPos;--j)
        {
            if (array[j-1]>array[j])
            {
                exchange(&array[j],&array[j-1]);

                lastSwapPos_temp = j-1;  //记录最后一次交换的位置
            }
        }
    }
}

 

posted on 2015-09-15 10:18  那个(_少年  阅读(176)  评论(0)    收藏  举报