排序算法分析 --- 冒泡排序

一 算法描述

假设有n个元素,现在要把这些元素按照从小到大的顺序进行排序,那么算法步骤如下,

  1. 从第0个元素开始,比较相邻的两个元素,第0个和第1个,第1个和第2个,…,第n-2个和第n-1个,比较范围是[0, n-1],所有元素都参与比较
  2. 如果左边的比右边的大,就交换他们的位置,一直比较到最后一个元素。这样经过第一轮交换,最后一个元素就是所有元素里最大的
  3. 重复第1步操作,比较范围是[0, n-2],即第n-1个元素不再参与比较
  4. 重复第1步操作,比较范围是[0, n-3],即第n-1个和第n-2个元素不再参与比较
  5. 重复…直到比较范围是[0],即只剩下一个元素没有排序,则排序结束,总共需要交换n-1轮

二 C代码

常规写法

void bubbleSort(int arr[], int len)
{
    int temp;
    for (int i = 0; i < len - 1; ++i) //i表示轮,0表示第1轮交换,1表示第2轮交换...
    {
        for (int j = 0; j < len - 1 - i; ++j) // 每一轮都要设置参与排序的元素范围
        {
            if (arr[j] > arr[j+1])
            {
                // 交换
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}

递归写法

void bubbleSort(int arr[], int len)
{
    if (1 == len) // 递归操作一定要有结束条件
        returnint temp;
    for (int i = 0; i < len - 1; ++i) // 进行一轮比较
    {
        if (arr[i] > arr[i+1])
        {
            // 交换
            temp = arr[i];
            arr[i] = arr[i+1];
            arr[i+1] = temp;
         }
    }
    bubbleSort(arr, len-1); // 进行下一轮比较,注意元素范围
}

三 小tip

问:为什么总共需要比较n-1轮?
答:因为总共有n个元素,如果n=1,不需要进行比较,如果n>1,那么每比较一轮,就排好一个元素,直到只有一个元素没有排好时,则整个排序过程就结束了,因为最后那个元素肯定是最小的。除去最后剩的那一个元素,总共排好了n-1个元素,也就是要比较n-1轮。


四 总结

冒泡排序是一种经典的排序算法,也比较简单。理解这个算法只要弄清2点就可以了,一是每轮交换参与比较的元素范围,二是总共需要进行多少轮交换。

另外,网上的例程基本都是对整形数进行排序,其实也可以对结构体或者C++里的对象进行排序,只要结构体或C++对象里有可以参与比较的元素就行。

如果有写的不对的地方,希望能留言指正,谢谢阅读。

猜你喜欢

转载自blog.csdn.net/whahu1989/article/details/83117742