首页 > 代码库 > 算法学习之排序的那些事(一)
算法学习之排序的那些事(一)
????????排序的目的就是对一组无序的元素按照一定的次序排列起来。那么总的来说排序要做到事情就只有两件,找到各个元素按照一定次序排列后的位置并把各个元素移动到其所对应的位置。由此看出决定一个排序算法效率的因素也就是这两个:
- 寻找元素位置所消耗的时间
- 移动元素到其对应位置所消耗的时间
下面是一些常用的排序算法:
冒泡排序:
算法描述:算法比较简单就不多描述了。
实现步骤:
- 对N个元素做N-1次循环(每次循环至少可以把一个元素移动的正确的位置,N-1次循环后便把N个元素排列好了)
- 每次循环进行N-1-i次循环,判断元素是否在正确位置,不是则和相邻的元素交换位置(把元素移动到正确的位置)
代码示例:Java描述
结果演示:
结论:冒泡排序的时间复杂度为O(n2),实现方法简单,在元素数少的时候较实用,但在元素数多的时候效率就显得太低了。
?
选择排序:
算法描述:和冒泡排序一样是基础的排序就不多描述了。
实现步骤:
- 对N个元素做N-1次循环(每次循环至少可以把一个元素移动的正确的位置,N-1次循环后便把N个元素排列好了)
- 每次循环从第i+1个元素开始,找到第i个位置要放的元素,并把它移动到此处(把元素移动到正确的位置)
代码示例:Java描述
结果演示:
结论:选择排序的时间复杂度为O(n2),实现方法也比较简单,同时可以看出在元素数较少时和冒泡排序差别不大,在元素数较多时效率则明显比冒泡排序的高,这是由于其移动元素是直接把元素移动到其对应的位置,而不是像冒泡排序那样一层一层的移动,所以减少了移动元素的次数,缩短了移动时间,但对大量元素进行排序时效率仍然欠缺。
?
计数排序:
算法描述:建立一张元素对应的顺序表,然后把元素的顺序记录在表中。
实现步骤:
- 建立一张元素表,表的长度为元素的范围L。(用于记录元素的顺序)
- 遍历要排序的N个元素,元素每出现一次,其表中对应位置的+1(记录元素顺序)
- 根据元素表给对元素进行排序
代码示例:Java描述
结果演示:
结论:计数排序的时间复杂度为O(N+L),空间复杂度也为O(N+K),这是一种非基于比较的方法,完全消除了移动元素到正确位置所消耗的时间,从而可以突破基于比较的排序算法的最低时间复杂度O(NlogN),但同时也带来了空间上的消耗,因此在使用这类有较强的条件限制,在特定的情况下能起到很好的效果,类似的还有桶排序,具体就不介绍了,附上代码吧….C语言描述
?
?
第一部分先写下这几种比较简单的,快排,希尔排序,堆排序正在学习中,过几天再写~~
算法学习之排序的那些事(一)