总结篇3-python数据结构和算法
业务代码最多的就是搞清楚业务关系,增删改查,实现业务功能,但是数据结构和算法却能提升性能,一个功能请求一次需要运行2^n还是n^2的时间,最终反映到用户响应时间差别是很大的,甚至有时候不优化性能可能就会卡死。
八大算法:
https://blog.csdn.net/u013719780/article/details/49201143/
记代码是没用的,关键要记住思想
1.插入排序
将一个数插入到一个有序列表中,从第一个位置开始,调整顺序,直到有序
def insert_sort(lists):
count = len(lists)
for i in range(1, count):
j = i - 1
key = lists[i]
while j >= 0:
if key < lists[j]:
lists[j+1] = lists[j]
lists[j] = key
j = j - 1
return lists
2.希尔排序
def shellSort(arr):
n = len(arr)
gap = int(n / 2)
while gap > 0:
for i in range(gap, n):
temp = arr[i]
j = i
while j >= gap and arr[j - gap] > temp:
arr[j] = arr[j - gap]
j -= gap
arr[j] = temp
gap = int(gap / 2)
arr = [12, 34, 54, 2, 3]
n = len(arr)
print("排序前:")
for i in range(n):
print(arr[i]),
shellSort(arr)
print("\n排序后:")
for i in range(n):
print(arr[i]),
3.简单选择排序
每次选一个最小的元素放到列表指定位置
def select_sort(lists):
for i in range(0, len(lists) - 1):
min_index = i
for j in range(i + 1, len(lists)):
if lists[j] < lists[min_index]:
min_index = j
if min_index != i:
lists[i], lists[min_index] = lists[min_index], lists[i]
return lists
print(select_sort(listA))
一开始尝试记录数值,后来发现还是记录下标最方便写,因为根本思想就是选择最小元素跟指定坐标交换
时间复杂度O(n^2)
4.堆排序
5.冒泡排序
比较相邻元素,较大的数往右,实际上每次循环都是让最大的数往右靠了。优化的话可以考虑最小的数同时也往左靠。
def bubble_sort(lists):
for i in range(0, len(lists)-1):
for j in range(i+1, len(lists)):
if lists[i] > lists[j]:
lists[i], lists[j] = lists[j], lists[i]
return lists
时间复杂度显然是O(n^2)
6.快速排序
选择一个基准值,一般第一个或者最后一个元素,比之大的往右交换,比之小的往左交换
#很酷的写法,快速排序
def quicksort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quicksort(left) + middle + quicksort(right)
print(quicksort([3,6,8,10,1,2,1]))
#前面那种列表推导生成式虽然容易理解,但是十分浪费空间
#真正的快排如下:
def quick_sort(L):
#用户传入数组,我们在内部分3个参数实现排序,数组,起始坐标,右坐标
return sort(L,0,len(L)-1)
def sort(L,left,right):
#获取中间值的函数
if left<right:
pivot = Partition(L,left,right)
sort(L,left,pivot-1)
sort(L,pivot+1,right)
return L
def Partition(L,left,right):
pivot = L[left]
while left < right:
while left<right and L[right]>=pivot:
right -= 1
L[left] = L[right]
while left<right and L[left]<=pivot:
left += 1
L[right] = L[left]
#出循环后,left=right,列表被分成围着privot这个数,左小右大的样子
#需继续对左右两个再做上面的操作
#对应的下标要改变
#左:left:0,right:left-1,pivot:L[left]
#右:left:left+1,right:len(L)-1,pivot:L[left]
L[left] = pivot#最后把中间值放到中间去
return left
L = [5, 9, 1, 11, 6, 7, 2, 4]
print (quick_sort(L))
7.桶排序
def Bucket_Sort(array, bucketsize):
minValue = min(array)
maxValue = max(array)
res = []
bucketcount = (maxValue - minValue + 1) // bucketsize
bucket_lists = [[] for i in range(bucketcount)]
for i in array:
bucket_index = (i - minValue) // bucketsize
bucket_lists[bucket_index].append(i)
# 桶内排序
for j in bucket_lists:
Quick_Sort_2(j, 0, len(j)-1)
for j in bucket_lists:
if len(j) != 0:
res.extend(j)
return res
8.归并排序
def merge(left, right):
i, j = 0, 0
result = []
while i < len(left) and j < len(right):
if left[i] <= right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result += left[i:]
result += right[j:]
return result
def merge_sort(lists):
# 归并排序
if len(lists) <= 1:
return lists
num = len(lists) / 2
left = merge_sort(lists[:num])
right = merge_sort(lists[num:])