冒泡排序

1.简述

  冒泡排序是一种简单的排序算法。通过相邻元素比较大小后交换位置,一次比较过后,当前数列的最大值被交换到当前最靠后的位置。下面有张动图演示了冒泡排序的过程。
  http://www.fuyangzhen.com/bootstrap/blog/001473581152607d48e5f3aa2344decaf786b159bac2524000
  
  从图中应该能看出来,一次冒泡排序的过程就是不断比较相邻元素大小后根据比较结果决定是否交换位置,结果就是把最大值给交换到后面去了。

2.实现

  下面用C实现冒泡排序:

void bubble_sort(int[] arr, int len) {
    int i, j, temp;
    for (i = 0; i < len - 1; i++) 
        for (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;
            }

}

  在上面的程序中,函数定义的len参数表示数组的长度,也就是数组元素个数。假如有一个10元素的数组需要排序,那么,其实是只需要冒泡9次的,因为最后一次就剩一个最小的元素了,不需要再和自己比较了。所以,这样就很好理解为什么会有i < len - 1了。从0到len - 2(i < len - 1)总共循环了len - 1次,也就相当于十个元素总共经历了9次冒泡。至于下面的j则是因为每次冒泡后,下一次再冒的时候就少了一个要比较的元素。最大的j = len -2,(j < len - 1 -0),则最大的j + 1等于len - 1,刚好是数组最后一个值。
  
  下面使用Java实现冒泡排序:

public void bubbleSort(int[] arr) {
    int i, j, temp, len = arr.length;
    for (i = 0; i < len - 1; i++)
        for (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;
            }
}

  使用Java和C是很相像的,不过,在计算数组长度时是有点方便的。

  下面使用Python实现冒泡排序,并实际使用了一个例子: 

import random

def bubble_sort(nums):
    amount = len(nums)
    for i in range(0, amount - 1):
        for j in range(0, amount - 1 - i):
            if nums[j] > nums[j + 1]:
                nums[j], nums[j + 1] = nums[j + 1], nums[j]

# 生成20个1到100之间的整数
nums = [random.randint(1, 100) for i in range(20)]
print 'Before bubble_sort nums is %s' % nums
bubble_sort(nums)
print 'After bubble_sort nums is %s' % nums

  下面是运行结果。
  这里写图片描述

上面使用Python代码做冒泡排序和C与Java保持了一致的结构,可以看到,使用Python来测试还是很方面的。

3.总结

  其实,冒泡排序算是一种很简单的排序算法了。一般开始学习排序算法的时候,就用这个入门了(好像还大都只是用在考试和应届生笔试中,好像还真没见到过哪个项目用了冒泡排序)。不过,这样也好,由简入繁,循序渐进,慢慢的也好理解其它的排序算法。下面是一张来自维基百科的冒泡排序的动态图,感受一下。
  
  这里写图片描述
  
  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值