排序算法总结 ╰半橙微兮° 2021-12-13 14:13 302阅读 0赞 # 常见排序算法评估 # ### 时间复杂度 ### O(n2):冒泡排序、选择排序、插入排序 O(nlogn):归并排序、快速排序、堆排序、希尔排序 O(n):计数排序、基数排序 不是基于比较的排序算法,思想来于桶排序 ### 空间复杂度 ### O(1):插入排序、选择排序、冒泡排序、堆排序(用递归实现是O(logn))、希尔排序 O(logn~n):快速排序 O(n):归并排序 O(m):计数排序,基数排序(m是“桶”的个数) ### 稳定性 ### 概念:假定待排序的记录序列中,存在多个具有相同关键字的记录,若经过排序,这些记录的相对次序保持不变,称这种排序算法是稳定的,否则称为不稳定的。 稳定的排序算法:冒泡排序、插入排序、归并排序、计数排序、基数排序、桶排序 不稳定的排序算法:选择排序、快速排序、希尔排序、堆排序 -------------------- # 常见排序算法及python实现 # ### 快速排序 ### 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 快排代码实现需要分割(partition)部分与递归实现部分。 # 快排 def partition(l, left, right): k = left val = l[right] for i in range(left, right): if l[i]<val: l[i], l[k] = l[k], l[i] k += 1 l[right], l[k] = l[k], l[right] return k def quicksort(l, left, right): if left<right: k0 = partition(l, left, right) quicksort(l, left, k0-1) quicksort(l, k0+1, right) return l L = [4,5,6,0,1,7,2,3] print(quicksort(L,0,len(L)-1)) ### 归并排序 ### 假设序列共有n个元素,将序列每相邻两个数字进行有序合并(merge),形成(n//2+n%2)个序列,排序后每个序列包含两个元素将上述序列再次归并,形成(n//4)个序列,每个序列包含四个元素。重复归并操作,直到所有元素排序完毕。 归并排序代码实现需要有序合并(merge)部分与递归实现部分。 # 归并排序 def merge(a,b): c = [] i = j = 0 while i<len(a) and j<len(b): if a[i]<b[j]: c.append(a[i]) i += 1 else: c.append(b[j]) j += 1 if i==len(a): for h in b[j:]: c.append(h) else: for h in a[i:]: c.append(h) return c def mergesort(l): if len(l)<=1: return l middle = len(l)//2 left = mergesort(l[:middle]) right = mergesort(l[middle:]) return merge(left,right) L = [4,5,6,0,1,7,3,3] print(mergesort(L)) ### TopK ### 维护大根堆实现,复杂度O(nlogk) def topk(k): return [x for x in reversed([heapq.heappop(data) for x in range(k)])] def push(elem,data,k): if len(data) < k: heapq.heappush(data, elem) else: topk_small = data[0] if elem > topk_small: heapq.heapreplace(data,elem) k = 7 data = [] list_rand = random.sample(range(1000000), 100) for i in list_rand: push(i,data,k) print(topk(k)) print(sorted(list_rand, reverse=True)[0:k]) #对比
相关 排序算法总结 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。 我们这里说说八 ﹏ヽ暗。殇╰゛Y/ 2022年07月15日 22:38/ 0 赞/ 179 阅读
相关 算法-排序算法总结 冒泡排序 朴素冒泡排序 反复扫描待排序序列,在扫描的过程中顺次比较相邻的两个元素的大小,若逆序就交换位置。第一趟,从第一个数据开始,比较相邻的两个数据,(以升序为例 短命女/ 2022年06月09日 01:58/ 0 赞/ 289 阅读
相关 排序算法总结 冒泡排序 时间复杂度为O(n2),最好情况下为O(n),空间复杂度为O(1)。稳定的 冒泡排序总结: void swap(int &a,int 比眉伴天荒/ 2022年05月18日 09:36/ 0 赞/ 204 阅读
相关 排序算法总结 排序算法总结 <table> <thead> <tr> <th align="center">排序算法</th> <th align="cent ╰半橙微兮°/ 2022年04月12日 08:57/ 0 赞/ 197 阅读
相关 排序算法总结 1.插入排序算法(附伪代码和C源码) 插入排序原理:从第i=2位开始到数组长度|A|截至。将当前i的值key取出来,从i开始从后往前\[1, i-1\]寻找小于(大 淩亂°似流年/ 2022年01月06日 04:09/ 0 赞/ 281 阅读
相关 排序算法总结 最近在看左神的算法视频,随便记录下自己的学习心得,方便以后review,也让大家对基本的排序算法有个了解。 冒泡排序 > 冒泡排序(英语:Bubble Sort)是一种 红太狼/ 2022年01月06日 01:51/ 0 赞/ 315 阅读
相关 排序算法总结 O(n2)的冒泡,选择,插入,先不贴,先贴归并,快排,堆排, O(nlog(n)) 归并排序 二路归并递归写法:时间O(nlog(n)),稳定,总时间O(nlog),空间 分手后的思念是犯贱/ 2021年12月21日 01:21/ 0 赞/ 263 阅读
相关 排序算法总结 1.冒泡排序 > 冒泡算法思想: > 1.从左到右依次比较相邻的元素。如果第一个比第二个大,就交换他们两个,等全部执行完,最后的元素就是最大的数,这 今天药忘吃喽~/ 2021年12月13日 15:01/ 0 赞/ 286 阅读
相关 排序算法总结 常见排序算法评估 时间复杂度 O(n2):冒泡排序、选择排序、插入排序 O(nlogn):归并排序、快速排序、堆排序、希尔排序 O(n):计数排序、基数排序 ╰半橙微兮°/ 2021年12月13日 14:13/ 0 赞/ 303 阅读
相关 排序算法总结 2019-07-20 import java.net.Socket; import java.util.Arrays; import java.uti 超、凢脫俗/ 2021年11月19日 14:54/ 0 赞/ 337 阅读
还没有评论,来说两句吧...