ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

总结篇3-python数据结构和算法

2021-02-25 17:03:08  阅读:214  来源: 互联网

标签:sort right python lists 算法 len pivot 数据结构 left


业务代码最多的就是搞清楚业务关系,增删改查,实现业务功能,但是数据结构和算法却能提升性能,一个功能请求一次需要运行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))

 

标签:sort,right,python,lists,算法,len,pivot,数据结构,left
来源: https://www.cnblogs.com/henry2019/p/14422540.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有