排序算法
一个正经程序员
高山仰止,景行行止,虽不能至,心向往之。
展开
-
算法系列10—基数排序
基数排序基数排序(Radix Sort)是按照低位先排序,然后收集,再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。基数排序基于分别排序,分别收集,所以是稳定的。时间复杂度平均为O(d(r+n)),最好为O(d(n+rd)),最坏O(d(r+n)),空间复杂度为O(rd+n),是一种稳定排序。d0 = [2, 15, 5, 9, 7, 6, 4, 12, 5, 4,原创 2020-05-31 16:14:41 · 9139 阅读 · 0 评论 -
算法系列9—桶排序
桶排序(Bucket Sort)是计数排序的升级版,它利用函数的映射关系,高效与否的关键在于映射函数的确定。桶排序的工作原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)平均时间复杂度为O(n+k),最好情况为O(n+k),最坏情况为O(n2)空间复杂度为O(n+k),稳定排序d0 = [2, 15, 5, 9, 7, 6, 4, 12, 5, 4, 2, 64, 5, 6, 4, 2, 3, 54, 45, 4原创 2020-05-31 16:13:17 · 9030 阅读 · 0 评论 -
算法系列8—计数排序
计数排序(Counting Sort)——字典计数-还原计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数计数排序是一种稳定的排序算法。计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。它只能对整数进行排序。时间复杂度为O(n+k),k代表整数的范围,最好最坏的情况相同。空间复杂度为O(k)d0 = [2, 15, 5, 9,原创 2020-05-31 16:12:14 · 9035 阅读 · 0 评论 -
算法系列7—堆排序
堆排序堆排序:是指利用堆这种数据结构所涉及的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是大于或者小于它的父节点时间复杂度平均为O(nlog2n),最好为O(nlog2n),最坏O(nlog2n),空间复杂度为O(1),不稳定排序d0 = [99, 5, 36, 7, 22, 17, 46, 12, 2, 19, 25, 28, 1, 92]def sort_max(data): # 直接冒泡一下吧,小到大 for i in range(原创 2020-05-31 16:10:37 · 9013 阅读 · 0 评论 -
算法系列5—归并排序
归并排序归并排序和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好得多。但是需要额外的内存空间。归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法的一个非常典型的应用。归并排序是一种稳定的排序方法。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路合并时间复杂度平均为O(nlog2n),最好为O(nlog2n),最坏O(nlog2n),空间复杂度为O(n),是一种:稳定排序。"""de原创 2020-05-31 16:09:26 · 9034 阅读 · 0 评论 -
算法系列4—希尔排序
希尔排序希尔排序(shell sort)也是一种插入排序,它是简单插入排序经过改进之后的更高效的版本,也被称为缩小增量排序,它与插入排序的不同之处在于,他会优先比较距离较远的元素。从大范围到小范围进行比较-交换时间复杂度平均为O(n1.3),最好为O(n),最坏O(n2),空间复杂度为O(1),是一种:不稳定排序。def insert_sort(alist): for i in range(1,len(alist)): for j in range(i,0,-1):原创 2020-05-31 16:06:17 · 8989 阅读 · 0 评论 -
算法系列11—python实现二分查找
python实现二分查找具备条件:1、顺序列表最优时间复杂度O(1),最坏为O(logn)算法思想: 以lst = [1, 3, 7, 8, 10, 11]为例 先有初始比较区间:[0-len(lst)] 第一次比较中间值:7 如果7比待比较的值大,则从[1,3]中取值 如果7比待比较的值小,则从[8,9,10]中取值 依次向下进行直到起始值大于终止值时结束 # 递归方法查找def binary_chop(lst,number): if len(ls原创 2020-05-31 16:01:17 · 9090 阅读 · 2 评论 -
算法系列6—快速排序
快速排序(Quick Sort)算法思想:首先找一个基准值,比基准值小的放在左边列表,比基准值大的放在右边列表,再分别在两边的列表中进行重复的操作,直到每个列表的长度<=1,将所有的列表进行合并。def quick_sort(arr): if len(arr) <= 1: return arr else: base = arr[0] less = [v for v in arr[1:] if v<=base]原创 2020-05-19 00:45:13 · 9025 阅读 · 0 评论 -
算法系列3—插入排序
插入排序(Insert Sort)算法思想:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。时间复杂度On2。list1=[9, 6, 8, 4, 7]def insert_sort(alist): #从第二个位置,即下标为1的元素开始向前插入 for i in range(1,len(alist)): flag = False #原创 2020-05-19 00:37:44 · 8976 阅读 · 0 评论 -
算法系列2—选择排序
选择排序(Select Sort)基本思想:在要排序的一组数中,选出最小(或最大)的一个数与第一个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个元素)比较为止。时间复杂度:On2def select_sort(alist): ''' :param alist: 将要排序的列表 :return: 排序完之后返回的列表 ''' n=len(alist) for i原创 2020-05-19 00:30:16 · 9049 阅读 · 0 评论 -
算法系列1—冒泡排序及优化
冒泡排序(Bubble Sort)冒泡排序是一种简单的排序算法,重复的遍历要排序的序列,一次比较两个元素,如果他们的元素错误就把他们的顺序交换过来遍历序列重复地进行直到没有再需要交换,也就是序列排序完成。算法名字的由来是因为越来越小的元素会经由交换慢慢的“浮”到数列的顶端。第一次排序完成之后最大的数在最后。时间复杂度为On2第一种方法:list1=[9, 6, 8, 4, 7]for i in range(1,len(list1)): for j in range(len(list1)原创 2020-05-19 00:23:07 · 9040 阅读 · 0 评论