冒泡排序
冒泡排序就是重复“从序列右边开始比较相邻两个数字的大小,再根据结果交换两个数字
的位置”这一操作的算法。在这个过程中,数字会像泡泡一样,慢慢从右往左“浮”到序列的
顶端,所以这个算法才被称为“冒泡排序”。
-
- 比较相邻元素, 如果第一个比第二个大, 就交换他们两个
-
- 对每一对相邻的元素做同样的工作, 执行完毕后, 找到第一个最大值
-
- 重复以上步骤, 每次比较 次数 - 1, 直到不需要比较
在冒泡排序中,第 1 轮需要比较 n -1 次,第 2 轮需要比较 n -2 次……第 n -1 轮需
要比较 1 次。因此,总的比较次数为 (n -1) +(n -2) +…+1 ≈ n^2
/2。这个比较次数恒定为该数值,和输入数据的排列顺序无关。
不过,交换数字的次数和输入数据的排列顺序有关。假设出现某种极端情况,如输
入数据正好以从小到大的顺序排列,那么便不需要任何交换操作;反过来,输入数据要
是以从大到小的顺序排列,那么每次比较数字后便都要进行交换。因此,冒泡排序的时
间复杂度为 O(n^2)。
- 一轮循环版本
ls = [5, 9, 3, 1, 2, 8, 4, 7, 6]
def bubbleSort(ls):
for j in range(len(ls)-1, 0, -1):
if ls[j - 1] > ls[j]:
ls[j - 1], ls[j] = ls[j], ls[j - 1]
for j in range(len(ls) - 1, 0, -1):
if ls[j - 1] > ls[j]:
ls[j - 1], ls[j] = ls[j], ls[j - 1]
for j in range(len(ls) - 1, 0, -1):
if ls[j - 1] > ls[j]:
ls[j - 1], ls[j] = ls[j], ls[j - 1]
for j in range(len(ls) - 1, 0, -1):
if ls[j - 1] > ls[j]:
ls[j - 1], ls[j] = ls[j], ls[j - 1]
for j in range(len(ls) - 1, 0, -1):
if ls[j - 1] > ls[j]:
ls[j - 1], ls[j] = ls[j], ls[j - 1]
return ls
print(bubbleSort(ls))
完整版
ls = [5, 9, 3, 1, 2, 8, 4, 7, 6]
def bubbleSort(ls):
for i in range(len(ls) -1):
for j in range(len(ls) - 1, i, -1):
if ls[j - 1] > ls[j]:
ls[j - 1], ls[j] = ls[j], ls[j - 1]
return ls
print(bubbleSort(ls))
选择排序(Selection-Sort)
先把最小的拿出来
剩下的, 再把最小的拿出来
剩下的, 再把最小的拿出来
。。。
每次选择还没处理的元素里最小的元素
选择排序就是重复“从待排序的数据中寻找最小值,将其与序列最左边的数字进行交换”这一操作的算法。在序列中寻找最小值时使用的是线性查找。
比如: 对数字1~9进行排序。 使用线性查找在数据中寻找最小值,于是我们找到了最小值 1
ls = [6, 1, 7, 8, 9, 3, 5, 4, 2]
def selectionSort(ls):
for i in range(len(ls)):
minIndex = i
for j in range(i+1, len(ls)):
if ls[minIndex] > ls[j]:
minIndex = j
if i != minIndex:
ls[i], ls[minIndex] = ls[minIndex], ls[i]
return(ls)
print(selectionSort(ls))
插入排序
每次处理一张牌, 把这张牌插入到前面已经排好序的牌中
插入排序是一种从序列左端开始依次对数据进行排序的算法。在排序过程中,左侧的数据陆续归位,而右侧留下的就是还未被排序的数据。插人排序的思路就是从右侧的未排序区域内取出一个数据,然后将它插人到已排序区域内合适的位置上。
ls = [5, 3, 4, 7, 2, 8, 6, 9, 1]
def insertSort(ls):
# 外层循环代表我已经拿到了第i个值, 正要准备插入到哪里
for i in range(len(ls)):
j = i
while j - 1 >= 0:
if ls[j] < ls[j - 1]:
ls[j], ls[j - 1] = ls[j - 1], ls[j]
else:
break
j -= 1
return ls
print(insertSort(ls))
第二种写法
nums = [5,3,6,4,1,2,8,7]
for i in range(1, len(nums)): #遍历未排序的元素
for j in range(i): #遍历已有序的元素
if nums[j]>nums[i]: #找到插入位置
ins = nums[i]
nums.pop(i)
nums.insert(j, ins)
break #完成插入后跳出for循环
print(nums)