面试题目-冒泡排序

面试题目-冒泡排序

冒泡排序是很基础的一种排序,虽然简单但是也好久没看了,乍一下没过脑子还是容易出错。

概念解释

先看为啥是冒泡,简单粗暴直接饮用百度百科的解释。
https://baike.baidu.com/item/%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F/4602306?fr=aladdin
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(末端),故名“冒泡排序”。

关键解释

每轮冒泡的结果是,已经排好序的元素(最大或最小)会浮到数列的最顶端。
所以下一次冒泡排序的操作范围应该减小,截止到上一次的最顶端元素之前。
所以我们应该用两层循环来做,内层循环我们进行数列两两之间的元素比较。
外层循环,我们用来控制冒泡的总次数(多少趟)也可以理解为截至的终点的动态控制。

代码解释

void BubbleSort(int a[], int len)
{
    int i,j;
    //这里的总体的思路是不变的外层控制总的冒泡趟数
    //内层控制每一趟的两两比较  但是写法可以有好多种
    for (i =0 ; i < len; i++)  //这层循环控制总的循环次数   截至的终点的动态控制
    {
        for(j = 1; j < len - i; j++)    // 这层的循环,注意每次循环我们要截止的地点不同 
        {
            if (a[j-1] > a[j])
            {
                Swap(a[j-1], a[j]);         
            }
        }
    }
}


//其他的写法  更多的写法请自己尝试
  for (i =0 ; i < len; i++)  
        for(j = 0; j < len - i-1; j++) 

for (i = len; i > 0; i--)   //今天回来检查发现这个地方竟然写错了  
      for (j = 0; j < i-1; j++)

算法的简单优化

设置一个标志flag, 如果这一趟(某一轮循环)发生了交换,设置为true;
如果有一趟(一轮)没有发生交换
说明排序已经排好,设置为false

void BubbleSort(int a[], int len)
{
    int i,j;
    bool flag;
    for (i =0 ; i < len; i++)  //这层循环控制总的循环次数
    {
        flag=true;
        for(j = 1; j < len - i; j++)    // 这层的循环,注意每次循环我们要截止的地点不同 
        {
            if (a[j-1] > a[j])
            {
                flag=false;
                Swap(a[j-1], a[j]);         
            }
        }
        if(flag)
        break;
    }
}

谨记

任何问题即使简单,也请想清楚思路在动手,谨记谨记。
今天回来检查发现上边一个地方写错了 惭愧 大家看文章也一定要自己思考验证,别人的思路不一定是正确的。

猜你喜欢

转载自blog.csdn.net/wwlcsdn000/article/details/80146253