java实现八大排序

我们知道排序是指将数据元素按照指定关键字值的大小递增(或递增)次序重新排列,有插入排序交换排序选择排序并归排序

1.直接插入排序

现有数组{23,15,56,14,26,58,99,33,78},我们从第一趟开始,将a0(此时的a0是一个已排好的排序子序列{23})赋值给变量temp,然后将a0与a1比较,若是a0>a1,则将a0赋值给a1,再将temp赋值给a0,此时排序子序列变成了{15,23}。(若是a0<a1,则a0还是a0,再进行下一趟排序)如此重复,直至子序列元素个数达到数组元素个数一样。算法实现:

 

2.二分法插入排序

直接插入排序的每一趟,将一个元素ai插入到它的前面的一个排序子序列中,其中采用的顺序查找算法寻找ai的插入位置。此时,子序列是顺序存储且排序的,这两条正好符合二分法查找要求。因此,用二分法查找代替直接插入排序中的顺序查找,则构成二分法插入排序。

 

3.希尔排序

希尔排序的算法思想是将一个数组分成若干组,每组有若干相隔距离(称为增量)的元素组成,在一组内采用直接插入排序算法进行排序,增量初值通常为数组长度的一半,以后一次减半,直至为1。算法如下:

4.冒泡排序

冒泡排序的算法:比较相邻两个元素大小,如果反序,则交换。若按升序排序,每趟将数据序列中最大元素交换到最后位置,就像气泡从水里冒出来一样。若现有序列{32,26,87,72,29,17},第一趟,将32与相邻元素比较,结果比26大,则交换,后又碰到87,32比87小,则将87与其相邻元素比较,依次得第一趟后的序列为{26,32,72,29,17,87},如此递归。算法实现如下:

 

 

 

5.快速排序

快速排序是一种分区交换排序算法,在数据序列中选择一个元素作为基准值,每趟从数据序列的两端开始进行交替,将小于基准值的元素交换到序列前端,将大于基准值的元素交换到序列后端,介于两者之间的位置则成为基准值得最终位置。同时,序列被划分为两个子序列,再分别对两个子序列进行快速排序,直到子序列长度为1,则完成排序。算法实现如下:

 

6.直接选择排序

直接选择排序算法思想:第一趟从n个元素的数据序列中选出关键字最小(大)的,然后将其放到最前(后)的位置,以后一次类推。若现有序列{38,97,26,19,39,15},第一趟就选出15,排序为{15,38,97,26,19,39},依次循环,直至最后一个选取的元素正好是最后那个位置。

 

7.堆排序

堆排序是利用完全二叉树特性的一种选择排序。

8.归并排序的算法

关键字序列{97,82,85,53,17,61,70,12,62,58,26}的归并排序(升序)的过程如下:

算法实现如下:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
选择排序算法准则: 每种排序算法都各有优缺点。因此,在实用时需根据不同情况适当选用,甚至可以将多种方法结合起来使用。 选择排序算法的依据 影响排序的因素有很多,平均时间复杂度低的算法并不一定就是最优的。相反,有时平均时间复杂度高的算法可能更适合某些特殊情况。同时,选择算法时还得考虑它的可读性,以利于软件的维护。一般而言,需要考虑的因素有以下四点: 1.待排序的记录数目n的大小; 2.记录本身数据量的大小,也就是记录除关键字外的其他信息量的大小; 3.关键字的结构及其分布情况; 4.对排序稳定性的要求。 设待排序元素的个数为n. 1)当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。 快速排序:是目前基于比较的内部排序被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短; 堆排序 : 如果内存空间允许且要求稳定性的, 归并排序:它有一定数量的数据移动,所以我们可能过与插入排序组合,先获得一定长度的序列,然后再合并,在效率上将有所提高。 2) 当n较大,内存空间允许,且要求稳定性 =》归并排序 3)当n较小,可采用直接插入或直接选择排序。 直接插入排序:当元素分布有序,直接插入排序将大大减少比较次数和移动记录的次数。 直接选择排序 :元素分布有序,如果不要求稳定性,选择直接选择排序 5)一般不使用或不直接使用传统的冒泡排序。 6)基数排序 它是一种稳定的排序算法,但有一定的局限性:   1、关键字可分解。   2、记录的关键字位数较少,如果密集更好   3、如果是数字时,最好是无符号的,否则将增加相应的映射复杂度,可先将其正负分开排序

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值