总结篇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.希尔排序

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))

 

上一篇:关于“The import org.junit.jupiter cannot be resolved”出现错误


下一篇:链表划分