用简单的思维理解选择插入冒泡和希尔排序
Posted 算法组
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用简单的思维理解选择插入冒泡和希尔排序相关的知识,希望对你有一定的参考价值。
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
无论输入初始状态如何,是否有序,都需要遍历数组来找出最小的元素。其他算法则更善于利用输入的初始状态来优化时间。
如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。
①交换次数O(n): 最好情况是,已经有序,交换0次;最坏情况是,逆序,交换n-1次
②比较次数O(n^2): (n-1)+(n-2)+…+1=n*(n-1)/2
最差时间复杂度 О(n²)
最优时间复杂度 О(n²)
平均时间复杂度 О(n²)
最差空间复杂度 总共О(n), 需要辅助空间O(1)
选择排序的示例动画。红色表示当前最小值,黄色表示已排序序列,蓝色表示当前位置。
通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
②取出下一个元素,在已经排序的元素序列中从后向前扫描
③如果该元素(已排序)大于新元素,将该元素移到下一位置
④重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的数目。该算法可以认为是插入排序的一个变种,称为二分查找插入排序。
直接插入排序是一种稳定的排序。对部分有序的数组十分高效,也很适合小规模数组。
②比较次数O(n^2):最好情况是,已经有序,需(n-1)次即可次;最坏情况是,逆序,需n(n-1)/2次
③赋值次数O(n^2):比较操作的次数加上(n-1)次
平均来说插入排序算法复杂度为O(n^2)。因而,插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,例如,量级小于千,那么插入排序还是一个不错的选择。
最差时间复杂度 О(n²)
最优时间复杂度 О(n)
平均时间复杂度 О(n²)
最差空间复杂度 总共О(n), 需要辅助空间O(1)
它重复地遍历过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
①比较相邻的元素。如果第一个比第二个大,就交换他们两个。
②对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
④持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
尽管这个算法是最简单了解和实现的排序算法之一,但它对于少数元素之外的数列排序是很没有效率的。
冒泡排序是与插入排序拥有相等的运行时间,但是两种算法在需要的交换次数却很大地不同。在最好的情况,冒泡排序需要O(n^2)次交换,而插入排序只要最多O(n)交换。冒泡排序的实现通常会对已经排序好的数列拙劣地运行O(n^2),而插入排序在这个例子只需要O(n)个运算
最差时间复杂度 О(n²)
最优时间复杂度 О(n)
平均时间复杂度 О(n²)
最差空间复杂度 总共О(n), 需要辅助空间O(1)
将数组列在一个表中并对列排序(用插入排序)。重复这过程,不过每次用更长的列来进行。最后整个表就只有一列了。将数组转换至表是为了更好地理解这算法,算法本身仅仅对原数组进行排序(通过增加索引的步长,例如是用i += step_size而不是i++)。
例如,假设有这样一组数[ 13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10 ],如果我们以步长为5开始进行排序,我们可以通过将这列表放在有5列的表中来更好地描述算法,这样他们就应该看起来是这样:
13 14 94 33 82
25 59 94 65 23
45 27 73 25 39
10
10 14 73 25 23
13 27 94 33 39
25 59 94 65 82
45
将上述四行数字,依序接在一起时我们得到:[ 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45 ].这时10已经移至正确位置了,然后再以3为步长进行排序:
10 14 73
25 23 13
27 94 33
39 25 59
94 65 82
45
10 14 13
25 23 33
27 25 59
39 65 73
45 94 82
94
最后以1步长进行排序(此时就是简单的插入排序了)。
步长的选择是希尔排序的重要部分。只要最终步长为1任何步长序列都可以工作。算法最开始以一定的步长进行排序。然后会继续以一定步长进行排序,最终算法以步长为1进行排序。当步长为1时,算法变为插入排序,这就保证了数据一定会被排序。
最差时间复杂度 根据步长序列的不同而不同,最好时为О(n(logn)^2)
最优时间复杂度 O(n)
平均时间复杂度 根据步长序列的不同而不同
最差空间复杂度 О(n)
以上是关于用简单的思维理解选择插入冒泡和希尔排序的主要内容,如果未能解决你的问题,请参考以下文章
常见排序算法的实现(归并排序快速排序堆排序选择排序插入排序希尔排序)
八大基础排序中(直接插入排序,希尔排序,冒泡排序, 快速排序,归并排序,简单选择排序)
直接插入排序 ,折半插入排序 ,简单选择排序, 希尔排序 ,冒泡排序 ,快速排序 ,堆排序 ,归并排序的图示以及代码,十分清楚
js排序算法总结——冒泡,快速,选择,插入,希尔,归并
七种基本排序算法(希尔排序,直接插入排序,冒泡排序,快速排序,简单选择排序,归并排序,堆排序)
手撕算法之冒泡选择插入希尔排序