算法与数据结构
王子老师
即将成为世界大牛
展开
-
算法:基数排序
算法—基数排序def radix_sort(li): max_num = max(li) it = 0 #表示桶的编号 while 10**it <= max_num: buckets = [[] for _ in range(10)] #分10个空桶 for val in li: digit = (val // 10**it) % 10 #对列表中的数字进行分桶 987%10=7 bucke原创 2020-05-31 07:28:31 · 135 阅读 · 0 评论 -
桶排序
桶排序def bucket_sort(li,n=10,counts=100): buckets = [[] for _ in range(n)] #创建桶 for val in li: i = min(val // (counts//n), n-1) #i 表示val值放到几号桶里 buckets[i].append(val) #使桶内的数字保持有序(冒泡) for j in range(len(buckets[i])-1,0原创 2020-05-30 23:49:51 · 126 阅读 · 0 评论 -
计数排序
计数排序def count_sort(li,count): #生成一个长度为count+1的列表,元素均为0 count = [0 for _ in range(count+1)] for val in li: #count列表下标是val的位置加1 count[val] += 1 li.clear() for ind,val in enumerate(count): #有val 个 ind ,将其添加到li列表中原创 2020-05-30 22:34:52 · 126 阅读 · 0 评论 -
希尔排序
原理:分组进行插入排序def insert_sort(li, gap): for i in range(gap, len(li)): temp = li[i] j = i - gap while j >= 0 and li[j] > temp: li[j + gap] = li[j] j -= gap li[j + gap] = tempdef shell(li):原创 2020-05-30 22:25:39 · 97 阅读 · 0 评论 -
归并排序
merge_sort 进行一次归并 前提是mid两端已经是有序列表merge 将列表拆分成一个一个的元素再重新进行有序组合def merge_sort(li,low,mid,high): i = low temp = [] j = mid + 1 while i <= mid and j<=high: if li[i] > li[j]: temp.append(li[j]) j += 1原创 2020-05-30 16:09:56 · 138 阅读 · 0 评论 -
堆排序
def sift(li, low, high): ''' :param li: 传入的列表 :param low: 根节点的下标 :param high:最后一个叶子节点 :return: ''' i = low #i最开始指向根节点 j = 2 * i + 1 #j开始是左孩子 temp = li[low] #存放堆顶元素 while j <= high: #保证j位置有数 if j原创 2020-05-28 09:17:02 · 139 阅读 · 0 评论 -
快速排序
快速排序算法实现def quik_sort(li,left,right): if left < right: mid = partition(li,left,right) quik_sort(li,left,mid-1) quik_sort(li,mid+1,right)def partition(data,left,right): ''' :param data: 传入的列表 :param left: 指针左端开原创 2020-05-27 09:28:31 · 141 阅读 · 0 评论 -
插入排序
选择排序import timeimport randomdef decorator(func): def wrapper(*args, **kwargs): start_time = time.time() func(*args, **kwargs) end_time = time.time() cost = end_time - start_time print("消耗时间为:%s"%(cost)) r原创 2020-05-27 07:10:36 · 166 阅读 · 0 评论 -
选择排序
1、开辟一个新的存储空间进行存储新的列表元素,同时循环内部的时间复杂度为n,因为用了min和remove,所以不推荐def select_sort(li): li_new = [] for i in range(len(li)): min_li = min(li) li_new.append(min_li) li.remove(min_li) print(li_new)li = [1,5,2,4,9,3]select_s原创 2020-05-26 08:01:02 · 144 阅读 · 0 评论 -
冒泡排序---列表
import randomdef bubble_sort(li): for i in range(len(li)-1): for j in range(len(li)-i-1): if li[j]>li[j+1]: #升序 降序改为小于即可 li[j+1],li[j] = li[j],li[j+1]#随机生成一个50范围内的长度为10的列表li = [random.randint(0,50) for i in原创 2020-05-26 06:57:20 · 257 阅读 · 0 评论 -
二分法---查找列表元素
def binary_search(list_,val): left = 0 right = len(list_)-1 while left<=right: mid = (left + right) // 2 if list_[mid] ==val: return mid elif list_[mid]>val: right = mid-1 else:原创 2020-05-26 06:56:08 · 341 阅读 · 0 评论 -
汉诺塔问题---递归算法
汉诺塔问题n个盘子,每次只允许移动一个盘子,大的必须在小的盘子下面。从a移动到c,如何设计算法实现?def hanoi(n,a,b,c): if n >0: hanoi(n-1,a,c,b) print('from %s to %s' %(a,c)) hanoi(n-1,b,a,c)hanoi(3,'a','b','c')运行结果:from a to cfrom a to bfrom c to bfrom a to cfrom b to afrom b to c原创 2020-05-25 22:06:23 · 212 阅读 · 0 评论 -
顺序查找
def linear_search(list_,val): for index,v in enumerate(list_): if val == v: return index else: return Noneli = [1,2,3,4,5,6,7,8,9]linear_search(li,5)原创 2020-05-25 22:23:38 · 173 阅读 · 0 评论 -
bubble_sort
encoding:UTF-8@Author: wangzi#冒泡排序import randomdef bubble_sort(li): for i in range(len(li)-1): exchange = False for j in range(len(li)-i-1): if li[j]>li[j+1]: ...原创 2020-04-20 11:39:35 · 201 阅读 · 0 评论