学点算法:冒泡排序及其改进

冒泡排序的主要思路是遍历整个数组,将数组中相邻的两个元素进行比较,如果比较中第二个元素比第一个元素小,则将两个元素的位置交换(假设是要排出正序),等第一次遍历完成我们会发现最大的那个元素已经‘冒泡’到数组的最后一个位置,接下来进行第二次遍历,比较范围是 第一个元素到倒数第二个元素(因为倒数第一个元素已经是最大,没有必要加入比较),继续做相邻两个元素的比较,以此类推。

关于算法的稳定性,冒泡排序是稳定的算法,因为在比较两个相邻的大小相同的数据时,它们的相对位置是不会被改变的,所以稳定性也得到保证。

python实现:

def bubble_sort(origin_items, comp=lambda x, y: x > y):
	 """冒泡排序"""
	 items = origin_items[:]
	 for i in range(len(items) - 1):
	     for j in range(i, len(items) - 1 - i):
	         if comp(items[j], items[j + 1]):
	             items[j], items[j + 1] = items[j + 1], items[j]
     return items

 

冒泡排序还有改进版,可以提高排序效率,思路主要在原有逻辑的基础上,加一层判断,如果在前面的比较有发生过元素位置的交换,则从数组的倒数第二个元素开始往前再做一次相邻元素比较与交换位置,我们在每次遍历操作的结尾多做一次判断:是否在本次遍历中是否发生过元素位置的交换,如果没有,则可以说明数组已经完成排序,可以直接退出遍历,以此类推。这样既可以加快排序,又可以及时退出遍历,节省时间资源。

python实现:

def bubble_sort(origin_items, comp=lambda x, y: x > y):
     """冒泡排序(改进版)"""
     items = origin_items[:]
     for i in range(len(items) - 1):
         swapped = False
         for j in range(i, len(items) - 1 - i):
             if comp(items[j], items[j + 1]):
                 items[j], items[j + 1] = items[j + 1], items[j]
                 swapped = True
         if swapped:
             swapped = False
             for j in range(len(items) - 2 - i, i, -1):
                 if comp(items[j - 1], items[j]):
                     items[j], items[j - 1] = items[j - 1], items[j]
                     swapped = True
         if not swapped:
             break
     return items

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值