排序
引子:网购时我们查找某件商品时,会搜出很多的数据,这时我们可能会按照价格从小到大排序或者信用排序 或者综合排序等,这就引出了接下来这个排序的概念.
定义
定义:假设含有n个记录的序列,使其按照某个关键字有序的过程,这样的操作为排序.
- 同样的序列,针对不同的关键字排序,会得到不同的序列.比如班级的成绩表,按总成绩 语文成绩 数学成绩 会得到3种不同的结果,再比如淘宝时,我们按照价格从低到高 或综合排序 等都会得到不同的结果.
- 问题来了,若是多个关键字,要怎么排序呢?暂时先放下.
内排序和外排序:
根据排序过程中待排序的记录是否全部被放置在内存中,排序分为:外排序和内排序.
- 内排序:在整个排序的过程中,待排序的所有记录全部放在内存中.
- 外排序:由于排序的记录的个数太多,不能同时放置在内存中,整个排序过程需要在内外存之间多次交换数据才能进行.
我们主要研究的是内排序的算法.
影响排序算法性能的因素有:
- 时间性能:排序是数据处理经常执行的一种操作,往往属于系统的核心部分,因此排序算法的时间开销量是衡量其好坏的最重要的标注.在内排序中,主要进行的两种操作是:比较和移动.比较指关键字之间的比较,这是排序最起码得操作.移动指的是记录从一个位置移动到另个一个位置.
总之,高效率的内排序算法应该是具有尽可能少的关键字比较次数和尽可能少的记录移动次数.
- 辅助空间:评价算法的另一个指标:执行算法所需要的辅助存储空间.辅助存储空间是除了存放待排序所占用的存储空间之外,执行算法需要的其他存储空间.
- 算法的复杂性:这里指的是算法本身的复杂度,而不是算法的时间复杂度.显然算法过于复杂也会影响排序的性能.
内排序的分类:
根据排序过程中借助的操作,我们把内排序分为:插入排序 交换排序 选择排序 和 归并排序
冒泡排序
冒泡排序方法1:
|
|
冒泡排序方法2
|
|
冒泡排序方法3
|
|
简单选择排序
炒股票的人,总喜欢不断的买进卖出,想通过价差来实现利润,但通常这种频繁操作的人,即使失误不多,也会因为操作的手续费和印花税过高而获利很少.但还有一种人,他们很少出手,只是不断的观察和判断,等到时机一到,果断出手,因为冷静和沉着,以及交易次数少,而最终受益颇丰.
冒泡排序的思想就是不断的交换,最终完成最终的排序,这个股票短线频繁的交易类似.
那后一类人,我们需要找到合适的关键字再做交换,并且只移动一次就完成相应关键字的排序,这是选择排序的初步思想.
最终的排序思想:每一趟在 n - i + 1 (一共是n个)个记录中选取关键字最小的作为有序序列的第 i 个记录.
快速排序
|
|
直接插入排序
|
|
二分排序(插入排序)
|
|
希尔排序
|
|
堆排序
|
|
选择排序
|
|
归并排序
|
|