思考
你知道的排序算法有哪些?
快速排序、冒泡排序、希尔排序、二分排序(二路归并)、桶排序、堆排序、基数排序、插入排序、选择排序。
平时用的最多的排序算法又有哪些呢?
下面七种排序算法,要搞得非常清楚,知其然知其所以然。
插入希尔归并:递进
选择冒泡快速:递进
堆排序:树论高级篇里面。
他们的效率怎么样呢?
为什么发明这么多种排序,什么情况下用什么排序呢?
排序算法
我们通常从哪几个方面来分析一个排序算法?
1.时间效率:决定了算法运行多久
2.空间复杂度
3.比较次数交换次数:排序肯定会涉及两个操作,交换和比较
4.稳定性,相同的两个数排序后,相对位置不变。
稳定排序是什么?
比如,排好序后
第一种:
第二种:
明显第一种是稳定的,因为相同的数字6,在排序后,红色6在绿色6前面,相对位置不变。
稳定性排序有什么意义?应用在哪里呢?
举例:电商里面的订单需要排序:首选会按金额从小到大排序,金额相同的按下单时间排序。我们从订单中心过来的时候已经按时间排好序了。
比如订单数据:
idtimeprice
19:元
:元
:元
:元
我们选择排序算法的时候,如果我们选择不稳定的排序算法,那我们比较金额后还要比较时间,如果我们选择稳定的算法,那我们只要比较金额。
插入排序
假设有个这样的问题,一个有序的数组,我们往里面添加一个新的数据后,如何继续保持数据有序呢?我们只要遍历数组,找到数据应该插入的位置将其插入即可。
再比如,我们打扑克的时候,牌会分成两部分:一部分是你手里的牌(已经排好序),一部分是要拿的牌(无序)。把一个无序的数列一个个插入到有序数列中。
以上这种往一个有序的集合里面插入元素,插入后序列仍然有序这就是插入排序算法思路。
理解起来不难吧。那么插入排序具体是怎么实现呢?
具体步骤如下:
1.将数组分成已排序段和未排序段。初始化时已排序端只有一个元素
2.到未排序段取元素插入到已排序段,并保证插入后仍然有序
3.重复执行上述操作,直到未排序段元素全部加完。
有几种数据结构,用什么数据结构来实现?数组或者链表实现。
看以下这个例子:对进行插入排序
从以上操作中我们看到插入排序会经历一个元素的比较以及元素的移动。当我们从待排序列中取一个数插入到已排序区间时,需要拿它与已排序区间的数依次进行比较,直到找到合适的位置,然后还要将插入点之后的元素进行往后移动。
那么用代码怎么实现呢?
/***1.将数组分成已排序段和未排序段。初始化时已排序端只有一个元素*2.到未排序段取元素插入到已排序段,并保证插入后仍然有序*3.重复执行上述操作,直到未排序段元素全部加完。**
authorHowell*emailhowellhong.