冒泡排序

冒泡排序是个著名的简单排序算法。而其基本只在介绍排序算法时才会被用到(呵呵呵)。

复杂度:O(n^2)


算法

1.从数组起始,对比每对相邻的元素,如果逆序,交换它们;

2.如果上步骤由交换,重复步骤1.

可以把数字想象成泡泡,每轮交换大的泡泡都向上浮动。到没有泡泡移动,排序结束。下面看个例子:

对数组{5, 1, 12, -5, 16}进行冒泡排序。

Bubble sort example

复杂度分析

平均和最坏复杂度都是O(n^2)。并且,在最坏情况下进行O(n^2)次交换。冒泡排序是适应性算法,即对排好序的数组,复杂度为O(n)。

乌龟和兔子

冒泡排序的一个很大问题是:它的运行时间依赖于数组的初始排序。大的数(兔子)上升得很快,而小的数(乌龟)下降的很慢。这个问题在鸡尾酒排序(Cocktail sort)中得到解决。

乌龟实例

数组{2, 3, 4, 5, 1}基本排序好了,需要O(n^2)的迭代步骤数,其中{1}就是乌龟元素。

Turtle example

兔子例子

属猪{6, 1, 2, 3, 4, 5}基本已排序,需要O(n)的迭代步骤数。元素{6}为兔子。这个例子充分展示了冒泡排序的适应性。

Rabbit example

实例

Java实现

public void bubbleSort(int[] arr) {
      boolean swapped = true;
      int j = 0;
      int tmp;
      while (swapped) {
            swapped = false;
            j++;
            for (int i = 0; i < arr.length - j; i++) {                                       
                  if (arr[i] > arr[i + 1]) {                          
                        tmp = arr[i];
                        arr[i] = arr[i + 1];
                        arr[i + 1] = tmp;
                        swapped = true;
                  }
            }                
      }
}

C++实现

void bubbleSort(int arr[], int n) {
      bool swapped = true;
      int j = 0;
      int tmp;
      while (swapped) {
            swapped = false;
            j++;
            for (int i = 0; i < n - j; i++) {
                  if (arr[i] > arr[i + 1]) {
                        tmp = arr[i];
                        arr[i] = arr[i + 1];
                        arr[i + 1] = tmp;
                        swapped = true;
                  }
            }
      }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值