java排序(1):基本概念和各种排序的概述

转载:http://blog.csdn.net/u011080472/article/details/51296419#t1

一.排序的分类

1.内部排序与外部排序

按照排序过程设计的存储器的不同分为内部排序与外部排序。内部排序完全在内存中进行,适合数据量不太大的数据元素的排序。外部排序需要访问外部存储器,待排序的数据元素非常多,以至于它们必须存储在外部存储器上。
外部排序的过程主要是依据数据的内外存交换和“内部归并”两者结合起来实现。
一般提到排序都是指内排序,比如快速排序,堆排序,归并排序等,所谓内排序就是可以在内存中完成的排序。RAM的访问速度大约是磁盘的25万倍,我们当然希望如果可以的话都是内排来完成。

2.稳定排序与不稳定排序

如果对任意一组数据元素序列,使用排序算法排序后,相同关键字之间的前后位置关系在排序前后保持一致,则该排序算法是稳定的。否则为不稳定排序。

二.内排序的方法

内排序的过程是一个逐步扩大记录的有序序列长度的过程。基于不同的“扩大”方法,内排序方法可分为插入类、交换类、选择类、归并类。

1.插入类排序

在一个已经有序的序列中,插入一个新的记录。这类排序有:直接插入排序、折半插入排序、希尔排序。

2.交换类排序

该类方法的核心是“交换”,即每趟排序,都是通过一系列的“交换”动作完成的。这类排序有:冒泡排序、快速排序。

3.选择类排序

该方法的核心是“选择”,即每趟排序都选出一个最小(或最大)的记录,把它和序列中的第一个(或最后一个)记录交换,这样最小(或最大)的记录到位。这类排序有:选择排序、堆排序。

4.归并类排序

所谓归并,就是将两个或两个以上的有序序列合并成一个新的有序序列。这类排序有:(二路)归并排序。

5.基数类排序

此类方法较为特别,是基于多关键字排序的思想,把一个逻辑关键字拆分成多个关键字,如一副扑克牌,按照基数排序思想可以先按花色排序,则分成4堆,每堆再按A-K的顺序排序,使得整副扑克牌最终有序。

三.排序算法性能比较

主要标准是算法的时间复杂度和空间复杂度。常用的排序算法可用谐音的方式来记忆“冒择路兮快归堆”,指的是冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、堆排序。
这里写图片描述

关于排序算法的选择,可以参考:
如果n比较小(n<=50),可以采用直接插入排序或者直接选择排序。
如果记录序列初始状态基本有序(指正序),则应该选用直接插入排序、冒泡排序。
如果n比较大,则应该采用时间复杂度为O(nlog2n):快速排序、堆排序或归并排序
快速排序是目前基于比较的内部排序中被认为是最好的,当待排序的关键字是随机分布式,快速排序的平均时间最短;堆排序所需要的辅助空间少于快速排序,并且不会出现快速排序可能出现的最坏情况,这两种排序都是不稳定的;当内存空间允许,且要求排序是稳定时,则可以选用归并排序,比较次数最少。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值