1、算法介绍,lowB三人组,快速排序
1、什么是算法
2、递归
# 一直递归,递归完成再打印
def func4(x):
if x > 0:
func4(x - 1)
print(x) func4(5)
3、时间 复杂度
(1)引入
时间复杂度:用来评估算法运行效率的一个东西
(2)小结
时间复杂度是用来估计算法运行时间的一个式子(单位)。
一般来说,时间复杂度高的算法比复杂度低的算法快
(3)判断标准
(4)空间复杂度
4、列表查找:二分查找
(1)线性查找(顺序查找)
(2)二分查找
(3)alex版本
重新开辟了一块字典空间
(5)对比
不要在一个递归函数上直接加装饰器
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/07/30 0030 9:54
# @Author : Venicid
# @Site :
# @File : 02_half_search.py
# @Software: PyCharm import time def cal_time(func):
def wrapper(*args, **kwargs):
t1 = time.time()
x = func(*args, **kwargs)
t2 = time.time()
print("Time cost: ",func.__name__, t2-t1)
return x
return wrapper # 线性查找
@cal_time
def linear_search(data_set,value):
for i in range(len(data_set)):
if data_set[i] == value:
return i
return 0 # alex版本的
# 不要在一个递归函数上直接加装饰器
# @cal_time
def _binary_search(dataset, find_num):
if len(dataset) > 1:
mid = int(len(dataset) / 2)
if dataset[mid] == find_num: # find it
pass
# print("找到数字", dataset[mid])
elif dataset[mid] > find_num: # 找的数在mid左面
# print("\033[31;1m找的数在mid[%s]左面\033[0m" % dataset[mid])
return _binary_search(dataset[0:mid], find_num)
else: # 找的数在mid右面
# print("\033[32;1m找的数在mid[%s]右面\033[0m" % dataset[mid])
return _binary_search(dataset[mid + 1:], find_num)
else:
if dataset[0] == find_num: # find it
pass
# print("找到数字啦", dataset[0])
else:
pass
# print("没的分了,要找的数字[%s]不在列表里" % find_num) @cal_time
def binary_search(data_set, val):
return _binary_search(data_set, val) # 二分法必须是有序列表
@cal_time
def half_search(data_set, value):
low = 0
high = len(data_set) - 1 while low <= high:
mid = (low + high) // 2
if data_set[mid] == value:
return mid
elif data_set[mid] > value:
high = mid - 1
else:
low = mid + 1 data = list(range(100000000))
linear_search(data, 153)
binary_search(data, 153)
half_search(data, 153)
(6)列表查找:练习
[
{id:1001, name:"张三", age:20},
{id:1002, name:"李四", age:25},
{id:1004, name:"王五", age:23},
{id:1007, name:"赵六", age:33}
]
# -*- coding: utf-8 -*-
# @Time : 2018/07/30 0030 11:42
# @Author : Venicid
import random
def random_list(n):
"""生成学生信息表"""
ret = []
ids = list(range(100,100+n))
name_1 = ['赵','钱','孙','李','王']
name_2 = ['打','算','发','的','撒','个','法','师']
name_3 = ['梅','兰','竹','菊','天','下','第','一']
for i in range(n):
dic = {}
dic['id'] = ids[i]
dic['name'] = random.choice(name_1)+random.choice(name_2)+random.choice(name_3)
dic['age'] = random.randint(18, 55)
ret.append(dic)
return ret def half_search(data_set, value):
low = 0
high = len(data_set) - 1 while low <= high:
mid = (low+high) //2
if data_set[mid]['id'] == value:
return mid
elif data_set[mid]['id'] > value:
high = mid-1
else:
low = mid+1 stus = random_list(5)
ret = half_search(stus,104)
print('index',ret)
print(stus[ret])
5、列表排序
6、冒泡排序
(1)冒泡排序思路
(2)基础版本
(3)冒泡排序-优化
如果冒泡排序中执行一趟而没有交换,则列表已经是有序状态,可以直接结束算法。
(4)最优时间复杂度,最坏时间复杂度
# -*- coding: utf-8 -*-
# @Time : 2018/07/30 0030 13:06
# @Author : Venicid import random
import time def cal_time(func):
def wrapper(*args, **kwargs):
t1 = time.time()
x = func(*args, **kwargs)
t2 = time.time()
print("Time cost: ",func.__name__, t2-t1)
return x
return wrapper # 冒泡排序 O(n) 最坏时间复杂度
@cal_time
def bubble_sort(li):
for i in range(len(li) - 1): # 趟数
for j in range(len(li) - i - 1): # j表示每次遍历需要比较的次数,是逐渐减小的
if li[j] > li[j + 1]: # 从小到大
# if li[j] < li[j + 1]: # 从大到小
li[j], li[j + 1] = li[j + 1], li[j] # 冒泡排序 优化
@cal_time
def bubble_sort_1(li):
for i in range(len(li) - 1):
exchange = False
for j in range(len(li) - i - 1):
if li[j] > li[j + 1]:
li[j], li[j + 1] = li[j + 1], li[j]
exchange = True
if not exchange:
break data = list(range(1000)) # 理想状态的,有序list 最优时间复杂度
# random.shuffle(data) # 洗牌
bubble_sort(data)
bubble_sort_1(data)
print(data)
7 、选择排序
(1)选择排序思路
(2)选择排序代码
def select_sort(li):
for i in range(len(li)-1):
min_index = i # 记录最小位置
for j in range(i+1, len(li)):
if li[j] < li[min_index]:
min_index = j
if min_index != i: # 如果选择出的数据不在正确位置,进行交换
li[i],li[min_index] = li[min_index],li[i] data = list(range(1000))
random.shuffle(data) # 洗牌
select_sort(data)
print(data)
8、插入排序
(1)思路
(2)演示图
def insert_sort(li):
for i in range(1, len(li)): # 从第二个位置,即下标为1的元素开始向前插入
tmp = li[i]
j = i - 1
while j >= 0 and li[j] > tmp:
li[j + 1] = li[j]
j = j - 1
li[j + 1] = tmp data = list(range(1000))
random.shuffle(data) # 洗牌
insert_sort(data)
print(data)
9、总结--排序Lowb 三人组
# -*- coding: utf-8 -*-
# @Time : 2018/07/30 0030 11:42
# @Author : Venicid import random
import time def random_list(n):
"""生成学生信息表"""
ret = []
ids = list(range(100,100+n))
name_1 = ['赵','钱','孙','李','王']
name_2 = ['打','算','发','的','撒','个','法','师']
name_3 = ['梅','兰','竹','菊','天','下','第','一']
for i in range(n):
dic = {}
dic['id'] = ids[i]
dic['name'] = random.choice(name_1)+random.choice(name_2)+random.choice(name_3)
dic['age'] = random.randint(18, 55)
ret.append(dic)
return ret def bubble_sort(li):
for i in range(len(li)-1):
for j in range(len(li)-i-1):
if li[j]['id'] > li[j+1]['id']:
li[j],li[j+1]=li[j+1],li[j] stus = random_list(5)
random.shuffle(stus)
print(stus)
bubble_sort(stus)
print(stus)
10、快速排序:选出基准元素
(1)思路
(2)过程图
(3)快速排序代码第一步
(4)partition函数
def quick_sort(data, left, right):
if left<right: # 递归的退出条件
mid = partition(data, left,right)
quick_sort(data,left,mid-1) # 对基准元素左边的子序列进行快速排序
quick_sort(data,mid+1, right) # 对基准元素右边的子序列进行快速排序 def partition(data,left, right):
tmp = data[left]
while left<right:
while left < right and data[right] >=tmp: # 如果left与right未重合,right指向的元素不比基准元素小,则right向左移动
right -=1
data[left] = data[right] # 将right指向的元素放到left的位置上 while left <right and data[left] <= tmp:
left+=1
data[right] = data[left] data[left] = tmp # 将基准元素放到该位置
return left data = list(range(1000))
random.shuffle(data) # 洗牌
quick_sort(data,0,len(data)-1)
print(data)
(5)冒泡,快速,sort对比
# -*- coding: utf-8 -*-
# @Time : 2018/07/30 0030 15:34
# @Author : Venicid import time
import copy
import sys def cal_time(func):
def wrapper(*args, **kwargs):
t1 = time.time()
x = func(*args, **kwargs)
t2 = time.time()
print("Time cost: ", func.__name__, t2 - t1)
return x return wrapper # 冒泡排序 优化
@cal_time
def bubble_sort_1(li):
for i in range(len(li) - 1):
exchange = False
for j in range(len(li) - i - 1):
if li[j] > li[j + 1]:
li[j], li[j + 1] = li[j + 1], li[j]
exchange = True
if not exchange:
break # 快速排序
# 不能直接在递归函数上写装饰器
def quick_sort__(data, left, right):
if left<right: # 递归的退出条件
mid = partition(data, left,right)
quick_sort__(data,left,mid-1) # 对基准元素左边的子序列进行快速排序
quick_sort__(data,mid+1, right) # 对基准元素右边的子序列进行快速排序 def partition(data,left, right):
tmp = data[left]
while left<right:
while left < right and data[right] >=tmp: # 如果left与right未重合,right指向的元素不比基准元素小,则right向左移动
right -=1
data[left] = data[right] # 将right指向的元素放到left的位置上 while left <right and data[left] <= tmp:
left+=1
data[right] = data[left] data[left] = tmp # 将基准元素放到该位置
return left @cal_time
def quick_sort(data):
return quick_sort__(data, 0, len(data)-1) # python自带的sort (底层是c语言)
@cal_time
def sys_sort(data):
return data.sort() # print(sys.getrecursionlimit()) # 查看递归深度
sys.setrecursionlimit(100000) # 设置递归 # data = list(range(10000))
data = list(range(1000,1,-1)) # 最坏情况下
# random.shuffle(data)
data1 = copy.deepcopy(data)
data2 = copy.deepcopy(data)
data3 = copy.deepcopy(data) bubble_sort_1(data1)
quick_sort(data2)
sys_sort(data3)
递归问题
python的递归深度为999
正常情况下
系统的sort底层是c
最坏情况下
(6)快速排序练习
学生表排序
# -*- coding: utf-8 -*-
# @Time : 2018/07/30 0030 16:07
# @Author : Venicid
import random
def random_list(n):
"""生成学生信息表"""
ret = []
ids = list(range(100,100+n))
name_1 = ['赵','钱','孙','李','王']
name_2 = ['打','算','发','的','撒','个','法','师']
name_3 = ['梅','兰','竹','菊','天','下','第','一']
for i in range(n):
dic = {}
dic['id'] = ids[i]
dic['name'] = random.choice(name_1)+random.choice(name_2)+random.choice(name_3)
dic['age'] = random.randint(18, 55)
ret.append(dic)
return ret def quick_sort(data, left, right):
if left<right: # 递归的退出条件
mid = partition(data, left,right)
quick_sort(data,left,mid-1)
quick_sort(data,mid+1, right) def partition(data,left, right):
tmp = data[left]
while left<right:
while left < right and data[right]['id'] >=tmp['id']:
right -=1
data[left] = data[right] while left <right and data[left]['id'] <= tmp['id']:
left+=1
data[right] = data[left] data[left] = tmp # 将基准元素放到该位置
return left stus = random_list(5)
random.shuffle(stus)
print(stus) quick_sort(stus,0,len(stus)-1)
print(stus)
1、算法介绍,lowB三人组,快速排序的更多相关文章
- 算法 排序lowB三人组 冒泡排序 选择排序 插入排序
参考博客:基于python的七种经典排序算法 [经典排序算法][集锦] 经典排序算法及python实现 首先明确,算法的实质 是 列表排序.具体就是操作的列表,将无序列表变成有序列表! 一 ...
- 算法之LOWB三人组之选择排序
选择排序 思想是在一个列表中每次循环一遍,拿到最小值,接着再从剩下的无序区中继续拿最小值,如此循环,直到结束. 时间复杂度为O(n^2) # 最简单的一个选择排序,循环一个列表,拿到最小值,添加到一个 ...
- 算法之LOWB三人组之冒泡排序
排序 冒泡排序(Bubble Sort)时间复杂度为O(n^2) 列表每两个相邻的数,如果前面比后面大,则交换这两个数 一趟排序完成后,则无序区减少一个数,有序区增加一个数. def bubble_s ...
- 算法之LOWB三人组之插入排序
插入排序 思想:类似于抽扑克牌,共有8张扑克牌,手里默认有一张,桌面上有7张,我们每次从桌面上抽一张和手里的牌进行比较,如果比手里的牌大,则直接放到手里的牌的后面,如果比手里的牌小,则放到手里的牌的前 ...
- 算法排序-lowB三人组
冒泡排序思路: 选择排序思路: 插入排序思路: 小结: 详细代码解释看下一篇
- 算法排序-NB三人组
快速排序: 堆排序: 二叉树: 两种特殊二叉树: 二叉树的存储方式: 小结: 堆排序正题: 向下调整: 堆排序过程: 堆排序-内置模块: 扩展问题topk: 归并排序: 怎么使用: NB三人组小结
- lowB三人组算法-冒泡排序-选择排序-插入排序
冒泡排序 时间复杂度:O(n2) 算法稳定 第一趟,从第一个数开始,相邻两个数比较,大的数交换放后,交换到最后位置得出一个第一大数 第二趟,从第一个数开始,相邻两个数比较,大的数交换放后,交换到倒数 ...
- 排序算法Nb三人组-快速排序
核心思想: 将列表中第一个元素拿出来,放到一边,左右两个循环,左面的大于拿出来的数,就把他挪到右面, 右面的小于拿出来的数就把他放在左面,这是列表被第一个元素''分''为两个列表,在对两个列表进行同样 ...
- 排序算法lowb三人组-插入排序
def insert_sort(li): for i in range(1, len(li)): # i表示摸到的牌的下标 tmp = li[i] # 摸到的牌 j = i - 1 while j & ...
随机推荐
- SqlServer触发器实现表的级联插入、级联更新
首先建立两张表,分别为test1与test2,期望在更改test1的时候,test2的相关记录能够同时做出更改.假定test1与test2的表结构相同,如下表所示 name age 触发器实现 ...
- C语言的参数传递
一.三道考题 开讲之前,我先请你做三道题目.(嘿嘿,得先把你的头脑搞昏才行……唉呀,谁扔我鸡蛋?) 考题一,程序代码如下:void Exchg1(int x, int y){ int tmp; ...
- SDWebImage动画加载图片
SDWebImage动画加载图片 效果 源码 https://github.com/YouXianMing/Animations // // PictureCell.m // SDWebImageLo ...
- virtual memory exhausted: Cannot allocate memory 解决方法
在阿里云买了个云服务器,内存1G.编译kudu时出现下面的错误: virtual memory exhausted: Cannot allocate memory 问题原因:由于物理内存本身很小,且阿 ...
- ubuntu16.04更新内核--使用4.6以上的内核会让用A卡的Dell电脑更快--及卸载多余内核
tips:我自己就是Dell的A卡电脑,用16.04桌面感觉不如fedora流畅,后来手动升级到4.6.2内核,发现可以和fedora与windows一般桌面操作流畅度. 我试过了4.7的开发版内核, ...
- JPEG图片扩展信息读取与改动
近日项目中须要用到往jpg图片中写入信息(非水印),经调研发现Android中已经封装了读写jpg图片扩展信息的api(ExifInterface). 相应api地址:http://developer ...
- P2110 欢总喊楼记
题目描述 诗经有云: 关关雎鸠,在河之洲.窈窕淑女,君子好逑. 又是一个被风吹过的夏天--一日欢总在图书馆中自习,抬起头来,只见一翩跹女子从面前飘过,真是回眸一笑百媚生,六宫粉黛无颜色!一阵诗情涌上欢 ...
- ethers.js-5-Utilities
https://docs.ethers.io/ethers.js/html/api-utils.html 使用时再进行查看即可
- 使用sqoop过程
With Sqoop, you can import data from a relational database system or a mainframe(主机) into HDFS. The ...
- docker常用命令(二)
把镜像保存到本为一个文件 docker save -o filename.tar imagename:tag 载入保存在本地的镜像 docker load < filename.tar 或者 d ...