![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
排序算法
翊夜
这个作者很懒,什么都没留下…
展开
-
排序算法——希尔排序
介绍从头实现希尔排序。希尔排序(Shell Sort)按其设计者希尔(Donald Shell)的名字命名,该算法由希尔 1959 年公布。是一种插入排序的改进方式。插入排序在排序的时候,需要逐一比较两两元素之间的大小,效率不高。希尔排序按照下标的增量将序列先分组,每个组里使用插入排序,这样可以跳跃地比较元素的大小,确定元素间的宏观位置。再经过慢慢缩减增量(有不同增量选取方式,通常取原增量的二分之一),可以微调元素位置,直到增量达到1时,所有元素排序完成。看起来希尔排序的步骤要比插入排序的多很多,那它原创 2021-08-28 15:46:03 · 172 阅读 · 0 评论 -
排序算法——选择排序
简介从头实现选择排序。选择排序(Selection sort)不断从乱序数列(后半部分)中选择最小(最大)值放入有序数列(前半部分)中,无论数据初始排列如何,其时间复杂度恒为O(n2)O(n^2)O(n2).好处是不占额外的空间复杂度。示例public class SelectionSort { public static void main(String[] args) { int[] arr = {57, 65, 54, 30, 45, 7, 6, 26, 35, 96原创 2021-08-28 15:45:58 · 67 阅读 · 0 评论 -
排序算法——桶排序
介绍从头实现桶排序。桶排序(Bucket sort)是将待排序集合中处于同一个值域的元素存入同一个桶中,也就是根据元素值特性将集合拆分为多个区域,则拆分后形成的多个桶,从值域上看是处于有序状态的。对每个桶中元素进行排序,则所有桶中元素构成的集合是已排序的。如果桶的大小划分得足够小,到达每个元素之间的最小差值,则可以保证每一个桶里面所有的数据都是一样的,入桶后的数据也就不需要再次进行排序,这种情况也就是桶排序时间复杂度最优的情况即O(n)O(n)O(n).一般情况下桶排序的时间复杂度为O(n+nlog(原创 2021-08-28 15:45:53 · 4873 阅读 · 1 评论 -
排序算法——插入排序
介绍从头实现插入排序。插入排序是一种比较简单的排序方式通过将新的元素插入到已经排好的序列中来完成排序的目的。其最坏时间复杂度为O(n2)O(n^2)O(n2),最好时间复杂度为O(n)O(n)O(n),平均时间复杂度我为O(n2)O(n^2)O(n2). 是一种比较基础而又低效的排序算法,在数据量较小时可以使用,此外,插入排序是稳定的。实现步骤将数组第一个元素作为已排序序列。依次遍历后续元素,将每个元素与以排好序列中的元素依次比较,直到找到一个合适的位置将其插入进去。图解对[17,5,原创 2021-08-28 15:45:47 · 115 阅读 · 0 评论 -
排序算法——堆排序
概述从头实现堆排序。堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。如果要从大到小排序,则应该使用大根堆,即根节点的值最大。时间复度为O(nlog(n))O(nlog(n))O(nlog(n)).步骤建堆(最大堆),常采用向上调整建堆将堆第一个元素与已排好数据前一位交换,进行下沉操作调整堆,同时乱序数据量减少一个直到所有数据排序完成可以看出,堆排序也是选择排序的一种原创 2021-08-28 15:45:32 · 295 阅读 · 0 评论 -
排序算法——归并排序
介绍从头实现归并排序。归并排序(MergeSort),是采用分治思想的一种算法,通过把要排序的数组依次递归对半拆分,当子数组达到长度1时,即只有一个元素,认为其为有序的,结束递归。使用递归排序时,无论原数组序列的排序情况如何,都要递归到最底层,所以时间复杂度相对固定。为O(nlog(n))O(nlog(n))O(nlog(n)). 归并排序可分为二路归并和多路归并,最常用的是二路归并,下文示例亦是针对二路归并排序的。另外,归并排序是稳定的。图解拆分阶段:合并阶段:示例代码def mer原创 2021-08-28 15:45:25 · 109 阅读 · 0 评论 -
排序算法——基数排序
概述从头实现基数排序。基数排序(radix sort)算法,就是按照整数的个位、十位、百位…等依次排列元素,局部最优排列最终可以获得全局最优。基数排序可以分为LSD和MSD两种,LSD就是从低位往高位排(个十百…),MSD是从高位往低位排(…百十个)。基数排序的时间复杂度为O(n∗k)O(n*k)O(n∗k),其中nnn为元素数量,kkk为最大元素的最高位(个位为1,十位为2…),当元素不是很大时(即kkk很小)可认为时间复杂度为O(n)O(n)O(n).实现过程算法步骤:取得数组中的最原创 2021-08-28 15:40:52 · 1342 阅读 · 0 评论 -
排序算法——计数排序
概述从头实现计数排序。计数排序是一个非基于比较的[序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为O(n+k)Ο(n+k)O(n+k)(其中k是整数的范围),快于任何比较排序算法。但是,计数排序算法的快速是使用空间来换取的。当整数范围过大时,其效率甚至不如复杂度为O(nlog(n))O(nlog(n))O(nlog(n))的比较排序类算法。计数排序适用于对整数进行排序,首先建立一个数组,初始值为0.数组的尺寸为需要排序元素的最原创 2021-08-28 15:45:17 · 76 阅读 · 0 评论 -
排序算法——快速排序
介绍从头实现快速排序。快速排序(Quick Sort)是对冒泡排序的一种改进。它运用到了分治思想,对每一个子序列分别排序。其平均时间复杂度为O(nlog(n))O(nlog(n))O(nlog(n)),最坏时间复杂度为O(n2)O(n^2)O(n2)。虽然在时间复杂度上并没有显著的优势,但在实际运用中效率比同时间复杂度的一些算法要高。实现基本步骤选取一个基元素,作为排序的对比标准,一般选取数组的第一个元素,也可以在中间随机选取。选取左指针和右指针(数组的以一个元素索引和最后一个元素索引)。原创 2021-08-28 15:45:09 · 73 阅读 · 0 评论 -
排序算法——冒泡
介绍手动从头实现一遍十大排序算法,便于加深理解。冒泡排序(Bubble Sort)就是元素两两比较,大的放后面,相等则不理会。交换完一次序列后最大的元素在序列尾部,第二次遍历时可以不予理会。反复遍历直到所有数排序完成。冒牌排序的最大时间复杂度为O(n2)O(n^2)O(n2),即所有元素以反序排列时。冒泡排序中,最大元素一个个漂浮到序列尾部,如同水泡冒起,因而得名。实现public class BubbleSort { public static void main(String[] a原创 2021-08-28 15:45:01 · 52 阅读 · 0 评论