一、冒泡排序
冒泡排序原理:将相邻的两个数进行比较,较大的数往上冒,较小的数往下降。达到一个升序的效果。
# 冒泡排序 def func(li): for i in range(len(li)-1): # i 表示第i趟 exchange = False for j in range(len(li)-i-1): # j 表示无序区里的元素下标 if li[j] > li[j+1]: li[j],li[j+1] = li[j+1],li[j] exchange = True if exchange == False: return None li = [3,2,5,4,1,6,7,8,9] func(li) print(li)
注意:exchange是一个优化,当第i趟的时候,已经排好序,那么就不用再继续遍历无序区的元素,进行比较。
时间复杂度为:O(n2)
二、选择排序
选择排序原理:以列表的第一个位置的数为基数,与剩余的数中最小的数进行比较,如果基数比最小的数要大,那么交换两个数的位置,否则位置不变。然后再以第二个位置的数为基数,与无序区中的最小数进行比较,如果基数比最小的数要大,那么交换两个数的位置,否则位置不变。以此类推。
# 选择排序 def func(li): for i in range(len(li)-1): # i 表示第i趟 min_id = i for j in range(i+1,len(li)): # j 表示无序区的元素下标 if li[j] < li[min_id]: min_id = j li[i],li[min_id] = li[min_id],li[i] li = [9,7,6,8,1,2,3,4,5] func(li) print(li)
注意:min_id接收的是最小元素的下标。len(li)-1为趟数。
时间复杂度为:O(n2)
三、插入排序
插入排序算法的原理:以列表的第一数为基数,随机抽取剩余数中一个作为随机数,与基数进行比较排序,再随机抽取剩余数中的一个作为随机数,与前面的小列表进行插入排序,依次类推。
# 插入排序 def func(li): for i in range(1,len(li)): tmb = li[i] j = i - 1 while j >= 0 and li[j] > tmb: li[j+1] = li[j] j -= 1 li[j+1] = tmb li = [4,3,6,5,1,2,7,8,9] func(li) print(li)
时间复杂度:O(n2)
四、快速排序
快速排序原理比较复杂,将最左边的数取出赋值给tmd,然后从最右边的开始遍历,找到比tmd小的数赋值给left这个位置,然后将从最左边开始遍历找到比tmd大的数,赋值为right位置,最后递归完成排序,看代码。
# 快速排序 def func(li,left,right): tmd = li[left] while left < right: while left < right and li[right] >= tmd: right -=1 li[left] = li[right] while left < right and li[left] <= tmd: left += 1 li[right] = li[left] li[left] = tmd return left def quick_sort(li,left,right): if left < right: mid = func(li,left,right) quick_sort(li,left,mid-1) quick_sort(li,mid+1,right) li = [5,7,3,4,2,1,8,9,6] # func(li,0,len(li)-1) quick_sort(li,0,len(li)-1) print(li)
时间复杂度:O(nlogn)