【Java】5大排序算法总结(插入排序+希尔排序+选择排序+堆排序+冒泡排序)

本文详细介绍了稳定性排序(如插入排序和冒泡排序)、希尔排序、选择排序、堆排序,以及它们各自的时间复杂度、空间复杂度和稳定性特点。特别关注了插入排序的优化、希尔排序的工作原理,以及堆排序的堆操作。适合理解各种排序算法在实际场景的应用。
摘要由CSDN通过智能技术生成

1. 稳定性

两个相等的数据,如果经过排序后,排序算法能保证其相对位置不发生变化,则我们称该算法是具备稳定性的排序算法。
在这里插入图片描述

图中排序后a仍然在b前面,此时这个排序就是稳定的。

常见的排序算法有 :
在这里插入图片描述

2 . 插入排序

步骤:

  1. 从第一个元素开始,该元素可以认为已经被排序
  2. 取下一个元素下标定义为i,并且放到变量tmp中,从已排序的元素序列从后往前扫描
  3. 如果该元素大于tem,则将该元素移到下一位
  4. 重复步骤3,直到找到已排序元素中小于等于tem的元素,直接break
  5. tem插入到该元素的后面(array[j+1]=tmp;),如果已排序所有元素都大于tem,则将tem插入到下标为0的位置
  6. 重复步骤2~5
 /**
     * 直接插入排序
     * 时间复杂度:O(N^2) 逆序的时候
     * (最好的情况是O(N):对于直接插入排序来说,最好的情况就是数组有序的时候)
     * 根据这个结论:推导出另一个结论:对于直接插入排序来说,数据越有序,越快
     * 直接插入排序所以也用于其他排序的优化!
     * 空间复杂度:O(1)
     * 稳定性:稳定
     * 一个稳定的排序,可以实现一个不稳定的排序
     * 但是一个本身就不稳定的排序就不可以变成稳定的排序
     * 经常使用在 数据量不多 且 整体数据趋于有序了
     * @param array
     */
    public void insertSort(int[] array){
   
        for (int i =1 ; i <array.length ; i++) {
   
            int tmp=array[i];
            int j=i-1;
            for (; j>=0 ; j--) {
   
                if (array[j]>tmp){
   
                    array[j+1]=array[j];
                }else {
   
                    // 只要j回退的时候,遇到了比tmp小的元素,就结束这次的比较
                    break;
                }
            }
            //j回退到了 小于0 的地方
            array[j+1]=tmp;
        }
    }

动图演示如下:
请添加图片描述

3. 希尔排序

步骤:

  1. 先选定一个小于N的整数gap作为第一增量,然后将所有距离为gap的元素分在同一组,并对每一组的元素进行直接插入排序。然后再取一个比第一增量小的整数作为第二增量,重复上述操作…
  2. 当增量的大小减到1时,就相当于整个序列被分到一组,进行一次直接插入排序,排序完成。
  /**
     * 希尔排序
     * 时间复杂度:O(N^1.3-N^1.5)
     * 空间复杂度:O(1)
     * 稳定性 : 不稳定的
     *  看在比较的过程当中,是否发生了跳跃式的交换,如果发生了跳跃式的交换 那么就是不稳定的排序
     *  (基本上没有考过)
     *
     * @param array
     * @param gap 组数
     */
    public static void shell(int[] array,int gap){
   
        for (int i =gap ; i <array.length ; i++) {
   
            int tmp=array[i];
            int j=i-ga
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值