写在最前面:
python本身内置了sort,sorted函数用于排序,那么这两者有什么区别呢?
sort 与 sorted 区别:
sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
而我打算把所有的排序做个整理,今天从冒泡排序开始
冒泡排序的思路是每次把前面的无序序列的最大值移动到最后一个
第一次循环都把n个元素中最大的元素移动至最后位置
第二次从前 n-1 个位置中找出最大元素放在最后
相邻两个不断比较交换
重复执行,直到最后结果全部有序
def bubble_sort(nums):
count = len(nums)
for i in range(count-1):
for j in range(count-i-1):
if nums[j] > nums[j+1]:
nums[j],nums[j+1] = nums[j+1],nums[j]
return nums
试一下
def bubble_sort(nums):
# n个数排序
# 排序n-1次
for i in range(len(nums)-1):
for j in range(len(nums)-i-1):
if nums[j] > nums[j+1]:
nums[j], nums[j+1] = nums[j+1], nums[j]
print('第{}趟结果{}'.format(i, nums))
return nums
if __name__ == '__main__':
# li = [4, 2, 5, 4, 5, 12, 0, 2, 3, 1, 1, 7, 4]
li = [3,4,1,2]
print('最后结果{}'.format(bubble_sort(li)))
第0趟结果[3, 1, 2, 4]
第1趟结果[1, 2, 3, 4]
第2趟结果[1, 2, 3, 4]
最后结果[1, 2, 3, 4]
发现一个问题,不需要排n-1趟,列表已经是有序的了
那么我们可以优化一下
如果一次交换都没有发生(只要发生一次交换,flag = True)
直接返回当前排序结果
def bubble_sort_plus(nums):
for i in range(len(nums) - 1):
flag = False # 改进后的冒泡,设置一个交换标志位
for j in range(len(nums) - i - 1):
if nums[j] > nums[j + 1]:
nums[j], nums[j + 1] = nums[j + 1], nums[j]
flag = True
if not flag:
return nums
这个是伪冒泡排序
def bubble_sort(nums):
# 伪冒泡排序
count = len(nums)
for i in range(count):
for j in range(i + 1, count):
if nums[i] > nums[j]:
nums[i], nums[j] = nums[j], nums[i]
return nums