![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
排序算法
顾小笙
这个作者很懒,什么都没留下…
展开
-
7,桶排序、基数排序、希尔排序、计数排序、位图排序、其他排序
桶排序是将数组分散到有限的桶中,然后每个桶再分别排序,而每个桶的排序又可以使用其他排序方式进行排序,可以是桶排序也可以是其他排序。桶的大小可以随便定,如果桶的数量足够多就会变成我们后面介绍的计数排序,其实我们完全可以把桶固定在一个数量,根据数组的大小来确定,也可以自己定,比如3个或者5个7个等,桶的大小确定之后,下一步就需要把数组中的值一一存放到桶里,小的值就会放到前面的桶里,大的值就会放到后面的桶里,中间的值就会放到中间的桶里,然后再分别对每个桶进行单独排序,最后再把所有桶的数据都合并到一起就会得到排序好原创 2020-06-23 20:11:22 · 218 阅读 · 0 评论 -
6,排序-堆排序
这一部分来分析一下堆排序,也可以理解为二叉树排序,这里的堆分为两种,一种是大顶堆,一种是小顶堆,我们所有的排序方法都以升序为主,其实倒序原理也都差不多,所以这里我们主要分析的是大顶堆。大顶堆就是根节点不小于他的两个子节点,先看一下代码 上面代码中heapSort方法表示对数组进行排序,buildMaxHeap表示堆的构建,maxHeapfy表示堆的调整,包括每次截取数据的时候也都需要调整,截取数据就相当于把root节点截取,然后用最后的一个节点替换到root的位置,然后再进行调整。看代码可能不是很直观原创 2020-06-10 13:43:46 · 201 阅读 · 0 评论 -
5,排序-归并排序
这一部分来分析一下归并排序,归并排序是把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。看一下代码 先把待排序列分为两部分,然后各部分再分为两部分,一直分下去,直到不能再分为止,然后在两两合并两个有序数组,直到合并完为止。有序数组的合并也很好理解,代码可以参考上面。上面代码在合并的时候都会创建一个临时数组tmp,如果排序的数组很大的话,每次merge的时候都会浪费大量的空间,不是最好的解决方式,这里可以优化一下,看代码 上面的代码都是递归实现的,下面看一个非原创 2020-06-08 17:21:40 · 118 阅读 · 0 评论 -
4,排序-快速排序
快速排序原理是首先要找到一个中枢,把小于中枢的值放到他前面,大于中枢的值放到他的右边,然后再以此方法对这两部分数据分别进行快速排序。先看一下代码 这里是先用待排数组的第一个作为中枢,把数组划分两部分,小于他的往前挪,那大于他的自然就在后面了,然后再把中枢值放到大于和小于他之间的位置。 快速排序其实有很多变种,我们可以再改一下,代码如下 这种实现方式和上面是一样的,只不过是换了种写法,他的原理中枢值先不动,把小于中枢的放到前面,大于中枢的放到后面,最后再把中枢值放到指定的位置。下面在看一种写原创 2020-06-05 11:19:56 · 170 阅读 · 0 评论 -
3,排序-插入排序
插入排序的原理是默认前面的元素都是已经排序好的,然后从后面逐个读取插入到前面排序好的合适的位置,就相当于打扑克的时候每获取一张牌的时候就插入到合适的位置一样。插入排序可以分为两种,一种是直接插入还一种是二分法插入,直接插入的原理比较简单,就是往前逐个查找直到找到合适的位置然后插入,二分法插入是先折半查找,找到合适的位置然后再插入。说到二分法查找,等排序完之后就会介绍查找,有多种包括斐波那契查找,哈希查找,二分法查找等多个,其实这里面也可以使用,我们先看一下简单的直接插入排序代码 可能还不是很严谨,如果原创 2020-06-03 20:11:12 · 145 阅读 · 0 评论 -
2,排序-选择排序
选择排序和冒泡排序有一点点像,选择排序是默认前面都是已经排序好的,然后从后面选择最小的放在前面排序好的的后面,首先第一轮循环的时候默认的排序好的为空,然后从后面选择最小的放到数组的第一个位置,第二轮循环的时候默认第一个元素是已经排序好的,然后从剩下的找出最小的放到数组的第二个位置,第三轮循环的时候默认前两个都是已经排序好的,然后再从剩下的选择一个最小的放到数组的第三个位置,以此类推。下面看一下代码。 我们看到每轮循环的时候并没有直接交换,而是从他后面的序列中找到最小的记录一下他的index索引,最后再交换原创 2020-06-03 20:04:47 · 107 阅读 · 0 评论 -
1,排序-冒泡排序
先了解一下常用的排序算法,查找算法以及常用的几种数据结构。 首先第一个常见的排序估计就是冒泡排序了,记得当年学C语言的时候学的第一个排序算法就是它,其实他的原理很简单,就和他的名字一样,先看一下代码 首先拿第一个元素和后面的所有一个个比较,如果比后面的大就交换,所以始终会保证第一个元素是最小的,然后再从第二个第三个,以此类推,swap方法表示交换两个数字的值。我们还可以再改一下。 我们看到每次循环的时候j都是从0开始的,并且是相邻两个元素的比较,所以第一轮比完了之后会把最大的值放到数组的最后,第二轮的..原创 2020-06-03 09:46:34 · 412 阅读 · 0 评论