几种常见排序算法

本文介绍了Java中的几种常见排序算法,包括插入排序、冒泡排序、快速排序和选择排序,详细讨论了它们的稳定性、时间复杂度和适用场景。例如,插入排序和冒泡排序是稳定的,而快速排序和希尔排序则不是。在实际应用中,根据数据规模、是否要求稳定性以及数据特性选择合适的排序算法至关重要。文章还提供了快速排序和选择排序的Java代码实现。
摘要由CSDN通过智能技术生成

            JAVA当中有以下几种常见排序算法:插入排序(直接插入排序、链表插入排序分段/二分/折半插入排序、希尔排序/缩小增量排序)、冒泡排序、快速排序、简单选择排序、归并排序、二叉树排序、基数排序等

1)复杂度比较

表1 几种常见排序算法的复杂度

算法名称

平均情况

最好情况

最坏情况

辅助空间

直接插入排序

O(n^2)

O(n)

O(n^2)

O(1)

希尔排序

O(nlog2n)~      o(n^2)

O(n^1.3)

O(n^2)

O(1)

冒泡排序

O(n^2)

O(n)

O(n^2)

O(1)

快速排序

O(nlog2n)

O(nlog2n)

O(n^2)

O(n)

简单选择排序

O(n^2)

O(n^2)

O(n^2)

O(1)

堆排序

O(nlog2n)

O(nlog2n)

O(nlog2n)

O(1)

归并排序

O(nlog2n)

O(nlog2n)

O(nlog2n)

O(n)

 

基数排序

O(n)

O(n)

O(n)

O(1)   

     


 什么是排序算法的稳定性? 假设在待排序的记录中,有若干个相同的元素,如果排序后它们的相对位置并没有发生变化,则说明该排序是稳定的。   (2)稳定性比较

插入排序、冒泡排序、二叉树排序、二路归并排序及其他线形排序是稳定的,

选择排序、希尔排序、快速排序、堆排序是不稳定的。

(3)其他方面比较

插入、冒泡排序的速度较慢,但参加排序的序列局部或整体有序时,这种排序能达到较快的速度。

反而在这种情况下,快速排序反而慢了。

n较小时,对稳定性不作要求时宜用选择排序,对稳定性有要求时宜用插入或冒泡排序。

若待排序的记录的关键字在一个明显有限范围内时,且空间允许时用桶排序。

n较大时,关键字元素比较随机,对稳定性没要求宜用快速排序。

n较大时,关键字元素可能出现本身是有序的,对稳定性有要求时,空间允许的情况下。

宜用归并排序。

n较大时,关键字元素可能出现本身是有序的,对稳定性没有要求时宜用堆排序。

=============================================================================
相关知识介绍(所有定义只为帮助读者理解相关概念,并非严格定义):
1
、稳定排序和非稳定排序

简单地说就是所有相等的数经过某种排序方法后,仍能保持它们在排序之前的相对次序,我们就
说这种排序方法是稳定的。反之,就是非稳定的。
比如:一组数排序前是a1,a2,a3,a4,a5,其中a2=a4,经过某种排序后为a1,a2,a4,a3,a5
则我们说这种排序是稳定的,因为a2排序前在a4的前面,排序后它还是在a4的前面。假如变成a1,a4,
a2,a3,a5
就不是稳定的了。

2、内排序和外排序

在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序;
在排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序方法称为外排序。

3、算法的时间复杂度和空间复杂度

所谓算法的时间复杂度,是指执行算法所需要的计算工作量。
一个算法的空间复杂度,一般是指执行这个算法所需要的内存空间。


=============================================================================

一、插入排序

包括:直接插入排序,二分插入排序(又称折半插入排序),链表插入排序,希尔排序(又称缩小增量排序)。属于稳定排序的一种(通俗地讲,就是两个相等的数不会交换位置)

a)直接插入排序

是一种简单的插入排序法,其基本思想是:把待排序的纪录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的纪录插入完为止,得到一个新的有序序列。已知一组升序排列数据a[1]a[2]……a[n],一组无序数据b[1]b[2]……b[m],需将二者合并成一个升序数列。首先比较b[1]a[1]的值,若b[1]大于a[1],则跳过,比较b[1]a[2]的值,若b[1]仍然大于a[2],则继续跳过,直到b[1]小于a数组中某一数据a[x],则将a[x]~a[n]分别向后移动一位,将b[1]插入到原来a[x]的位置这就完成了b[1]的插入。b[2]~b[m]用相同方法插入。(若无数组a,可将b[1]当作n=1的数组a

优点:稳定,快;

缺点:比较次数不一定,比较次数越少,插入点后的数据移动越多,特别是当数据总量庞大的时候,但用链表可以解决这个问题。

b)分段插入排序

已知一组升序排列数据a[1]a[2]……a[n],一组无序数据b[1]b[2]……b[m],需将二者合并成一个升序数列。先将数组a分成x等份(x<<n),每等份有n/x个数据。将每一段的第一个数据先储存在数组c中:c[1]c[2]……c[x]。运用插入排序处理数组b中的数据。插入时b先与c比较,确定了ba中的哪一段之后,再到a中相应的段中插入b。随着数据的插入,a中每一段的长度会有变化,所以在每次插入后,都要检测一下每段数据的量的标准差s,当其大于某一值时,将a重新分段。在数据量特别巨大时,可在a中的每一段中分子段,b先和主段的首数据比较,再和子段的首数据比较,可提高速度。

优点:快,比较次数少;

缺点:不适用于较少数据的排序,s的临界值无法确切获知,只能凭经验取。

c)希尔排序/缩小增量排序

由希尔在1959年提出,又称希尔排序。

已知一组无序数据a[1]a[2]……a[n],需将其按升序排列。发现当n不大时,插入排序的效果很好。首先取一增量d(d<n),将a[1]a[1+d]a[1+2d]……列为第一组,a[2]a[2+d]a[2+2d]……列为第二组……a[d]a[2d]a[3d]……列为最后一组依此类推,在各组内用插入排序,然后取d'<d,重复上述操作,直到d=1

优点:快,数据移动少;

缺点:不稳定,d的取值是多少,应取多少个不同的值,都无法确切知道,只能凭经验来取。

 

三、冒泡排序

已知一组无序数据a[1]a[2]……a[n],需将其按升序排列。首先比较a[1]a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变。再比较a[2]a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变。再比较a[3]a[4],依此类推,最后比较a[n-1]a[n]的值。这样处理一轮后,a[n]的值一定是这组数据中最大的。再对a[1]~a[n-1]以相同方法处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的。再对a[1]~a[n-2]以相同方法处理一轮,依此类推。共处理n-1轮后a[1]a[2]……a[n]就以升序排列了。

优点:稳定,比较次数已知;

缺点:慢,每次只能移动相邻两个数据,移动数据的次数多。

四、快速排序

================

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
几种常见排序 基于比较的排序算法: 下界是 nlgn 1.1 SelectionSort:每次选出最下的元素,放在当前循环最左边的位置。 1.2 BubbleSort:每次比较相邻的两个数,使得最大的数像气泡一样冒到最右边。 1. 3 InsertionSort:每次拿起一个数,插入到它左边数组的正确位置。 1.4 QuickSort:选择一个数,作为标准,小于它的放在左边,大于它的放在右边。并把它放在中间;递归地对左右子数组进行排序。 实现时:1. 确定递归结束条件,初始化左右游标, 选择标准数; 2. while循环,do while实现两个游标同时向中间移动,置换; 3. 置换标准数和右边游标所指的数; 4. 递归调用,对左右子数组进行排序。 1. 5 HeapSort:用最大堆实现。 实现时:建堆:置换堆顶元素和最后一个元素,堆大小减少,保持新的堆为最大堆; 保持最大堆: 从底向上依次保持最大堆,从第一个父节点到根部。 1.6 MergeSort:拆分数组,递归实现排序二路归并。用哨兵来阻止游标的越界。 线性时间运行的算法: 1.7 CountingSort: 假设数据分布在0到k之间的。对于每个输入x,确定出小于x的数的个数。假设小于x的数有17个,那么x就应该在第18个输出位置。 1. 8 Radix sort(基数排序):从最低位开始,每位采用稳定排序算法(如计数排序)。 1.9 Bucket sort:当输入数据比较均匀时采用。 先将数据区间分为n个桶,把数据分放到对应的桶中;对桶内的数据采用插入排序;再把各个桶的排序结果串起来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值