算法之常用排序
1.冒泡排序
思路:列表中两个相邻的数比较大小,如果前边的比后边的大,那么这两个就互换位置
1 def bubble_sort(li): 2 for i in range (1,len(li)-1): # 决定循环的次数 1~(len(li)-1) 3 for j in range (len(li)-i): # 无序区 范围 0~(len(li)-1) 4 if li[j]>li[j+1]: 5 li[j],li[j+1]=li[j+1],li[j] 6 7 li = list(range(10)) 8 import random 9 random.shuffle(li) 10 print(li) 11 bubble_sort(li) 12 print(li) 13 14 # 冒泡排序时间复杂度 O(n^2)
2.选择排序
思路:首先,列表每两个相邻的数比较大小,如果前边的比后边的大,那么这两个数就互换位置。就像是冒泡一样
import random def select_sort(li): for i in range(len(li)-1): #i 表示躺数,也表示无序区开始的位置 min_loc = i #最小数的位置 for j in range(i+1,len(li)): #i ,i+1,就是后一个位置的范围 if li[j] <li[min_loc]: #两个位置进行比较,如果后面的一个比最小的那个位置还小,说明就找到最小的了 min_loc = j #找到最小的位置 li[i],li[min_loc] = li[min_loc],li[i] #吧找到的两个值进行互换位置 li = list(range(10)) random.shuffle(li) print(li) select_sort(li) print(li) # 选择排序时间复杂度为O(n^2)
3.插入排序
思路:列表分为有序区和无序区,无序区中取到的数据放在有序区中。
插入后:
import random def insert_sort(li): for i in range(1, len(li)): # i 表示无序区的第一个数 hand = li[i] # 摸到的牌 j = i - 1 # 指向有序区最后一个位置 while li[j] > hand and j >= 0: # 循环终止条件 li[j]<=tmp and j==-1 li[j + 1] = li[j] # 向后移动 j -= 1 li[j + 1] = hand li = list(range(10)) random.shuffle(li) print(li) insert_sort(li) print(li)
4.归位排序
import time def wrapper(func): def inner(*args,**kwargs): start = time.time() ret = func(*args,**kwargs) end = time.time() print('%s running time :%s'%(func.__name__,start-end)) return ret return inner def partition(li,left,right): '''归位函数''' tmp = li[left] #先把5取出来 while left < right: while left < right and li[right] >= tmp: #如果降序排列修改li[right] <= tmp right -= 1 #从右边找比5小的数,填充到5的位置 li[left] = li[right] while left < right and li[left] <= tmp: #如果降序排列修改li[right] >= tmp left += 1# 从左边找比5大的数字放在右边的空位 li[right] = li[left] li[left] = tmp #当跳出循环条件的时候说明找到了,并且把拿出来的5在放进去 return left def _quick_sort(li,left,right): '''快速排序的两个关键点:归位,递归''' if left < right: #至少有两个元素,才能进行递归 mid = partition(li,left,right) #找到归位的位置 _quick_sort(li,left,mid-1) #递归,右边的-1 _quick_sort(li,mid+1,right) #递归,左边的+1 @wrapper def quick_sort(li): return _quick_sort(li, 0, len(li)-1) @wrapper def sys_sort(li): '''系统排序''' li.sort() import random li = list(range(100000)) random.shuffle(li) # print(li) quick_sort(li) # print(li) sys_sort(li)